假设我有这段代码。
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()语句如何添加对象?重复吗?
感谢。
答案 0 :(得分:3)
它不会复制它。它只是将对象的引用添加到列表中。
写作时
Data thisData = ...
thisData
是对您创建的Data
对象的引用。使用该引用将始终指向实例化对象,除非您明确复制此对象(通过复制构造函数,clone()
方法等。)
因此,重复将thisData
添加到列表中仅意味着您有多个引用同一对象的列表(或多个引用同一对象的列表)。如果您更改thisData
的成员,您会看到此内容。每个列表都会反映出这种变化。
注意这适用于对象。对于基元(int
,long
等),复制值。对于不可变对象(无法更改的对象),当然无关紧要。
答案 1 :(得分:1)
现在,您的列表在您的对象的实例中共享,static
任何调用.add(thisData)
的实例;将数据添加到您的列表
答案 2 :(得分:1)
static
表示如果您class
访问myData
的任何实例,或者您以<Classname>.myData
的身份访问它,那么您将与同一ArrayList
进行对话,即它在你班级的所有实例之间共享。
它与添加到它的内容无关。
编辑:静态x,y完全没有我。在这种情况下,Data
的所有实例将共享两个变量,即它们的值将是相同的。
这并不意味着它们只是同一个实例,因为==
操作将返回false。此外,Data
的任何其他变量将像往常一样对每个实例都是唯一的。
答案 3 :(得分:1)
您的数据阵列的所有实例将共享相同的字段x和y。任何修改尝试都将传播到所有新创建的实例。那么为什么在数组中有多个实例呢?
答案 4 :(得分:1)
它会在列表中放置一个由静态变量引用的对象。因此,如果您不更改静态变量,它将始终放置相同的对象,如果您正在创建由静态变量引用的新对象,则它将添加新的。但是要小心,如果你用一些将在已经添加到列表中的对象上显示的setter来改变对象的某些字段。