0

コピー コンストラクターによって変更された新しいオブジェクトを使用して、object2 をベクター位置 1 に設定しようとしました。

    Generic object1 = new Generic();
    //invoke the copy constructor of the Generic class

    Generic object2 = new Generic(object1);

    Vector<Generic> myVector = new Vector<Generic>();
    myVector.add(object1);
    myVector.add(object2);

このコードは、object1 のデータを入力した後に使用すると機能し、object2 は同じデータを取得します

    object2= new Generic(object1);
    myVector.setElementAt(object2, 1);

ただし、以下のコードは上記と同じはずだと思いましたが、object1 と同じデータが得られません (object1 のデフォルト値を取得するだけです)。

   myVector.setElementAt(new Generic(object1), 1);

2番目が機能しないのはなぜですか?

4

1 に答える 1

1

Ted Hopp がコメントで書いたように、2 番目のバリアントは に新しい値を割り当てないことを除いて、2 つのバリアントは同一ですobject2

Java の参照が常にコピーされるという事実に気付いていないと思います (参照されるオブジェクトではなく、参照自体myVector.add(object2);) object2

これは、オブジェクト自体を変更した場合(たとえば、これを呼び出すと、ベクトルの 2 番目の要素 (同じオブジェクトを参照しているため) とベクトルの 2 番目の要素のobject2.setValue("foo");両方に影響します) を意味します。 、まだ古いものを指しているため、ベクトルの 2 番目の要素は完全に独立しています。object2object2object2

これが役立つことを願っています:-)


List<Generic> myList = new ArrayList<Generic>();補足として、同期が必要でない限り、おそらく を使用する必要がありVectorます。

于 2012-09-23T23:53:07.080 に答える