澄清Java中的静态变量行为

时间:2013-10-09 07:05:58

标签: java

假设我有一个班级:

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

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

Class Dummy2{

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

     }

}

现在假设Dummy2我向temp添加了元素。这些变化是否会反映在Dummy.varArray中?因为这是我的计划中发生的事情。我试着打印两个地址,他们都指向同一个地址。不知道static字段是这样工作的。或者我做错了什么?

4 个答案:

答案 0 :(得分:5)

它不是静态的。语句ArrayList<String> temp = Dummy.varArray;表示两个变量都指的是同一个arraylist。由于varArray是静态的,因此它只有一个副本。

你可以阅读ArrayList<String> temp = Dummy.varArray; as,变量temp现在指的是Dummy.varArray引用的ArrayList对象

顺便说一下,在对它执行任何操作之前,需要使用public static ArrayList<String> varArray = new ArrayList<String>();对其进行初始化。

答案 1 :(得分:3)

ArrayList<String> temp = Dummy.varArray;将采用所谓的参考副本(或浅拷贝)。也就是说,他们将指向同一个对象。

它不需要深层复制。见How to clone ArrayList and also clone its contents?

答案 2 :(得分: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

答案 3 :(得分:0)

static关键字表示该变量只有一个实例,而不是每个实例一个变量。