静态变量的ArrayList

时间:2013-01-29 09:43:45

标签: java

假设我有这段代码。

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()语句如何添加对象?重复吗?

感谢。

5 个答案:

答案 0 :(得分:3)

它不会复制它。它只是将对象的引用添加到列表中。

写作时

Data thisData = ...

thisData是对您创建的Data对象的引用。使用该引用将始终指向实例化对象,除非您明确复制此对象(通过复制构造函数,clone()方法等。)

因此,重复将thisData添加到列表中仅意味着您有多个引用同一对象的列表(或多个引用同一对象的列表)。如果您更改thisData的成员,您会看到此内容。每个列表都会反映出这种变化。

注意这适用于对象。对于基元(intlong等),复制值。对于不可变对象(无法更改的对象),当然无关紧要。

答案 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来改变对象的某些字段。