假设我有一个班级:
class Dummy{
public static ArrayList<String> varArray;
}
在另一堂课中,我这样做:
Class Dummy2{
void main()
{
ArrayList<String> temp = Dummy.varArray;
}
}
现在假设Dummy2
我向temp
添加了元素。这些变化是否会反映在Dummy.varArray
中?因为这是我的计划中发生的事情。我试着打印两个地址,他们都指向同一个地址。不知道static
字段是这样工作的。或者我做错了什么?
答案 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关键字表示该变量只有一个实例,而不是每个实例一个变量。