假设我有这段代码。
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
的成员,则会看到此信息。每个列表都将反映此更改。请注意,这适用于对象。对于基元(
int
,long
等),将复制值。当然,对于不可变的对象(无法更改的对象),这并不重要。