0

この例は、Java プログラミングの本から取られています。第4版。

このコード例に出くわした後、「null」であると宣言したにもかかわらず、オブジェクトへの新しい参照を出力する理由がわかりません。理論的には、プログラム全体で共有されるオブジェクトへの参照を変更していますが、commonName メソッドでオブジェクトを null に初期化しています。commonName での制御の流れの時点で、本体コンストラクターのフィールドは「Sirius」に初期化されます。オブジェクトへの参照を変更すると (Java では値渡しで呼び出します)、フィールドは Dog Star に変更されます。メソッドの最後の行で、オブジェクト全体を null に設定します。オブジェクトを出力すると、ランタイムは null 参照を返します。

これを回避する唯一の方法は、commonName メソッドを final に設定することです。Java の第一人者は、特に値渡し言語でなぜこれが起こるのかを説明できますか?

class PassRef
{
    public static void main (String[] args) {
        Body sirius = new Body ("Sirus", null);
        System.out.println ("before: " + sirius);
        commonName(sirius);
        System.out.println("after: " + sirius);
    }

    public static void commonName (Body bodyref) {
        bodyref.name = "Dog Star";
        bodyref = null;
    }
}

出力:

before: 0 (Sirius)
after:  0 (Dog Star)
4

1 に答える 1

5

値渡しが何を意味するのか理解していないという理由だけで、あなたは不思議に思っています。

一般的なメソッドは、渡された参照を変更できません。そのため、nullは無視され、新しい値が出力されます。

渡された参照が指すオブジェクトの状態を変更することはできますが、参照自体の値を変更することはできません。

于 2012-10-06T15:53:42.527 に答える