假设我有这段代码。
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
问题是:静态前缀如何改变代码的行为? 我的意思是:myData 是否总是由同一个对象填充,因为它的字段 x 和 y 已被声明为静态的?还是 myData 总是由新对象填充? 换句话说:add() 语句如何添加对象?复制它?
谢谢。
最佳答案
它不会复制它。它只是将对象的引用 添加到列表中。
当你写的时候
Data thisData = ...
thisData
是对您创建的 Data
对象的引用。使用该引用将始终指向实例化对象,除非您显式复制该对象(通过复制构造函数、clone()
方法等)
如此重复地将 thisData
添加到列表中仅意味着您有多个列表引用同一对象(或多个列表引用同一对象)。如果您更改 thisData
的成员,您将看到它。每个列表都将反射(reflect)这一变化。
注意这适用于对象。对于原语(int
、long
等),值被复制。当然,对于不可变对象(immutable对象)(无法更改的对象)来说,这无关紧要。
关于java - 静态变量的ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14579836/