質問
このようなメンバー変数がある場合(クラスの本体で宣言されています)
private Dot[] dots=new Dot[numDots];
この配列のすべてのメンバーをループして、次のようにします。
1) すべての Dot オブジェクトを別のクラスの関数に渡します。
2) いくつかの条件が満たされた場合、それをさらに 3 番目のクラスの別の関数に渡します。
3) そして 3 番目のクラスは Dot オブジェクトのいくつかのプロパティを変更します
このオブジェクトが元の/親クラスに返されたとき、そのプロパティへの変更は保持されるでしょうか?それとも2番目/3番目の関数ではローカル変数のように扱われるのでしょうか?
解決
はい、プロパティへの変更は保持されます。 Javaは100%値渡しですが、オブジェクトを渡すと、「値」は渡されるのは、オブジェクトへのポインタです。したがって、メソッドでオブジェクトを変更すると、実際に渡されるオブジェクトも変更されます。
つまり、次のメソッドがある場合、呼び出し元のメソッドは変更を確認します:
private void updateMyDot(final Dot aDot) {
aDot.dotColor = new Color(255,255,255);
}
ただし、次の操作を行った場合、呼び出し元のメソッドには変更が表示されません。
private void updateMyDot(/* not final */ Dot aDot) {
aDot = new Dot();
aDot.dotColor = new Color(255,255,255);
}
2番目の例では、呼び出し元は変更を 表示せず、新しく作成された Dot
オブジェクトを表示しません。
他のヒント
オブジェクトは [ によって渡されます。参照 値が基準となる値] (Object から継承するもの)、プリミティブ値 (int、long、double など) は値渡しされます。
これは、プリミティブが呼び出し元からメソッドに渡されるとコピーされるのに対し、オブジェクトの場合は [の値] 参照が渡されます。
これは、オブジェクトがメソッドによって変更されると、呼び出し元は同じオブジェクトへの参照を持っているため、その変更を認識することを意味します。
逆に、メソッドがプリミティブを変更する場合、メソッドはコピーで作業しているため、呼び出し元には変更が表示されません。
【編集理由】
Java が参照渡しを持っていた場合、次のようにすることができます。
Object x;
x = new Integer(42);
foo(x);
System.out.println(x.getClass()); // pass by reference would have it print out java.lang.Float
ここで、foo は次のように定義されます。
void foo(Object o)
{
o = new Float(43);
}
Java は参照を値で渡すため、 o = new Float(43);
は許可されますが、呼び出し元の値はそのまま残ります。 new Integer(42);