この例は、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)