0

假设我有一堂课:

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

在另一堂课上,我这样做:

Class Dummy2{

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

     }

}

现在假设在Dummy2我添加元素到temp. 这些变化会反映在Dummy.varArray? 因为这就是我的程序中正在发生的事情。我尝试打印两者的地址,它们都指向同一个地址。不知道static现场是这样工作的。还是我做错了什么?

4

4 回答 4

5

它与静态无关。该语句ArrayList<String> temp = Dummy.varArray;意味着两个变量都引用同一个数组列表。由于varArray是静态的,它将只有一个副本。

您可以读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 关键字意味着该变量只有一个实例,而不是每个实例一个变量。

于 2013-10-09T07:09:27.817 回答