1

私がこのコードを持っているとしましょう。

public class Data {
    public static int x, y;
    // ...
}
// ...
public static ArrayList<Data> myData = new ArrayList<Data>();

さて、私のメインクラスから

Data thisData;
thisData.initData();
myData.add(thisData);
thisData.changeData();
myData.add(thisData);
// ... repeat and repeat and repeat

問題は、静的プレフィックスがコードの動作をどのように変更するかということです。つまり、フィールドxとyが静的であると宣言されているため、myDataには常に同じオブジェクトが入力されますか?または、myDataには常に新しいオブジェクトが入力されますか?言い換えると、add()ステートメントはどのようにオブジェクトを追加しますか?それを複製しますか?

ありがとう。

4

5 に答える 5

3

それは複製しません。オブジェクトの参照をリストに追加するだけです。

あなたが書くとき

Data thisData = ...

thisDataData作成したオブジェクトへの参照です。このオブジェクトを明示的にコピーしない限り、その参照を使用すると、インスタンス化されたオブジェクトが常にポイントされます (コピー コンストラクター、clone()メソッドなどを介して)。

したがって、リストに繰り返し追加thisDataするということは、同じオブジェクトを参照する複数のリスト (または同じオブジェクトを複数参照するリスト) があることを意味するだけです。のメンバーを変更すると、これが表示されますthisData。各リストには、この変更が反映されます。

これはオブジェクトに適用されることに注意してください。プリミティブ (など) の場合intlong値がコピーされます。もちろん、不変オブジェクト (変更できないオブジェクト) の場合は問題ありません。

于 2013-01-29T09:44:48.420 に答える
1

これで、 List がobject のインスタンス間で共有され、static

任意のインスタンス呼び出し.add(thisData); リストにデータを追加します

于 2013-01-29T09:46:51.163 に答える
1

staticclassは、アクセスのインスタンスmyDataまたは としてアクセスする場合<Classname>.myData、同じ と通信することを意味しますArrayList。つまり、クラスのすべてのインスタンス間で共有されます。

追加されたものとは何の関係もありません。

編集:静的なx、yは完全に私を逃しました。この場合、 のすべてのインスタンスはData2 つの変数を共有します。つまり、それらの値は同じになります。

これは、==操作が false を返すという理由だけで、それらが同じインスタンスであることを意味しません。また、その他の変数はData、通常どおり各インスタンスに固有です。

于 2013-01-29T09:47:15.350 に答える
1

データ配列のすべてのインスタンスは、同じフィールド x と y を共有します。変更しようとすると、新しく作成されたすべてのインスタンスに伝播されます。では、なぜ複数のインスタンスを配列に持つのでしょうか?

于 2013-01-29T09:47:23.727 に答える
1

静的変数によって参照されるオブジェクトをリストに入れます。したがって、静的変数を変更しない場合、常に同じオブジェクトが配置されます。静的変数によって参照される新しいオブジェクトを作成している場合、新しいオブジェクトが追加されます。ただし、リストに既に追加されているオブジェクトに現れるいくつかのセッターでオブジェクトのいくつかのフィールドを変更する場合は注意してください。

于 2013-01-29T09:47:53.523 に答える