2

Java プロジェクトの 1 つで、バグの原因となる問題に遭遇しました。問題は次のように聞こえます。

私は2つの配列を持っています。それらに firstArray と secondArray という名前を付けましょう。この場合のオブジェクトは、私が作成した別のクラスです。それは機能し、配列はそのタイプのオブジェクトで満たすことができます。

Object[] firstArray= new Object[];
Object[] secondArray = new Object[];

ここで、最初の配列から要素を取得し、それを編集してから 2 番目の配列にコピーすると、最初の配列のオブジェクトも変更されます。

tempObj = firstArray[3];
tempObj.modifySomething();
secondArray[3] = tempObj;

これを行うたびに、(この場合) 最初の配列の 3 番目の要素 (実際には 4 番目) が変更されます。私はこれをしたくありません。最初の配列を変更せずにそのまま残し、最初の配列から抽出して変更したオブジェクトを 2 番目の配列に格納して、2 番目の配列がコード実行後の最初の配列になるようにします。

PS Array.get(Array, index) を使用して最初の配列から要素を取得してから変更しても、要素は最初の配列で変更されます。

私が言いたいことを理解していただければ幸いです。もしそうなら、私に手を貸してください:)

ありがとうございました!

4

5 に答える 5

10

新しいオブジェクトを作成する必要があります。

問題はmodifySomething通話です。これを行うと、呼び出されたオブジェクトが変更されます。したがって、オブジェクトが 1 つしかない場合 (名前が 2 つであっても)、呼び出すことはできません。そうしないとmodifySomething、両方が変更されます。

と言うときはsecondArray[3] = firstArray[3]、新しいオブジェクトを作成しているのではなく、参照を割り当てているだけです。中間の一時参照を通過しても、それは変わりません。

次のようなコードが必要です。

Object tempObj = firstArray[3].clone();
tempObj.modifySomething();
secondArray[3] = tempObj;

このメソッドは、元のオブジェクトから分離された、同一のプロパティを持つ新しいclone()オブジェクトを返す必要があります。

于 2012-06-23T07:21:22.093 に答える
1

配列から要素を取得すると、それへの参照があります。したがって、それを変更すると、その変更はすべてのオブジェクトの参照を通じて共有されます。

そのままにしておくには、Object.clone() などのメソッドを使用するか、新しいオブジェクトを作成し、そのコンストラクターを使用してそのフィールドを初期化する必要があります。

于 2012-06-23T07:20:39.357 に答える
1

最初の配列から抽出されたオブジェクトを複製して、別の新しいインスタンスを作成する必要があります。そうしないと、同じオブジェクトであるため、変更は最初の配列のオブジェクトに影響します。

于 2012-06-23T07:20:48.903 に答える
1

Javaでは、これを行うとsecondArray[3] = tempObj;、実際のオブジェクトではなく、実際に配列への参照を配置します

したがって、同じ実際のオブジェクトfirstArray[3]secondArray[3]指します

あなたがする必要があるのは、元のオブジェクトと同一の新しいオブジェクトを作成し、新しいオブジェクトの参照をsecondArray

clone()デフォルト関数は浅いコピーのみを行うことを指摘する価値があるかもしれません。そのため、オブジェクトのフィールドに変更可能なオブジェクトがある場合、いくつかの問題が発生する可能性があります。ディープコピーの実行方法については、この記事をご覧ください

于 2012-06-23T07:20:54.053 に答える
1

配列から要素を取得すると、その要素への参照が取得されます。したがって、変更すると、その変更はすべてのオブジェクトの参照を通じて共有されます。

そのままにしておくには、次のようなメソッドを使用するかObject.clone()、取得したオブジェクトを入力して新しいオブジェクトを返す新しいメソッドを作成する必要があります。

于 2012-06-23T07:21:46.633 に答える