0

クラスがあるとします:

class Dummy{
public  static ArrayList<String> varArray;
}

別のクラスで私はこれを行います:

Class Dummy2{

   void main()
     {
         ArrayList<String> temp = Dummy.varArray;

     }

}

Dummy2に要素を追加するとしますtemp。変更は に反映されDummy.varArrayますか? これが私のプログラムで起こっていることだからです。2 つのアドレスを印刷してみましたが、どちらも同じアドレスを指しています。staticフィールドがこのように機能することを知りませんでした。それとも私は何か間違ったことをしていますか?

4

4 に答える 4

5

静的ではありません。このステートメントArrayList<String> temp = Dummy.varArray;は、両方の変数が同じ配列リストを参照していることを意味します。静的であるためvarArray、コピーは 1 つだけです。

ArrayList<String> temp = Dummy.varArray;次のように読むことができます。変数 temp は、Dummy.varArray によって参照されている ArrayList オブジェクトを参照しています。

ちなみに、public static ArrayList<String> varArray = new ArrayList<String>();操作を実行する前に、を使用して初期化する必要があります。

于 2013-10-09T07:07:48.387 に答える
3

ArrayList<String> temp = Dummy.varArray;は参照コピー(または浅いコピー)と呼ばれるものを取ります。つまり、それらは同じオブジェクトを指します。

ディープ コピーは必要ありません。ArrayList のクローンを作成し、そのコンテンツのクローンを作成する方法を参照してください。

于 2013-10-09T07:08:39.220 に答える
2

はい、正しく動作しています。

これを行うと

ArrayList<String> temp = Dummy.varArray;

どちらも同じ参照を指しています。リストではtempないため、new 参照することを伝えるだけです Dummy.varArray

それらを独立させるには、新しいリストを作成します

ArrayList<String> temp =  new ArrayList<String>(); //new List
temp.addAll(Dummy.varArray); //get those value to my list

注意点:

temp.addAll(Dummy.varArray) その時点で これを行う と、 の要素がvarArray に追加されtempます。

 ArrayList<String> temp =  new ArrayList<String>(); //new List
 temp.addAll(Dummy.varArray); //get those value to my list
 Dummy.varArray.add("newItem");// "newitem" is not  there in temp 

後で追加された要素は、魔法のように に追加されませんtemp

于 2013-10-09T07:08:16.757 に答える
0

static キーワードは、インスタンスごとに 1 つの変数ではなく、その変数のインスタンスが 1 つだけ存在することを意味します。

于 2013-10-09T07:09:27.817 に答える