質問

このようなメンバー変数がある場合(クラスの本体で宣言されています)

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);

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top