1

假设我有这个代码。

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

谢谢。

4

5 回答 5

3

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

当你写

Data thisData = ...

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

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

请注意,这适用于对象。对于基元(intlong),值被复制。当然,对于不可变对象(不能更改的对象),这并不重要。

于 2013-01-29T09:44:48.420 回答
1

现在您的 List在您的对象的实例之间共享,其中static

任何实例调用.add(thisData);将数据添加到您的列表中

于 2013-01-29T09:46:51.163 回答
1

static意味着如果您class访问的任何实例myData或者如果您以 身份访问它<Classname>.myData,您将与相同的 交谈ArrayList,即它在您的类的所有实例之间共享。

它与添加到其中的内容无关。

编辑:静态的 x,y 完全躲过了我。在这种情况下,所有实例Data将共享这两个变量,即它们的值将相同。

这并不意味着它们是同一个实例,因为==操作将返回 false。像往常一样,每个实例的任何其他变量也Data将是唯一的。

于 2013-01-29T09:47:15.350 回答
1

数据数组的所有实例将共享相同的字段 x 和 y。任何修改尝试都会传播到所有新创建的实例。那为什么要在数组中有多个实例呢?

于 2013-01-29T09:47:23.727 回答
1

它会将静态变量引用的对象放在列表中。因此,如果您不更改静态变量,它将始终放置相同的对象,如果您正在创建由静态变量引用的新对象,它将添加新对象。但要小心,如果您使用一些设置器更改对象的某些字段,这些设置器将显示在已添加到列表中的对象上。

于 2013-01-29T09:47:53.523 回答