Java 静态变量数组列表
假设我有这个代码Java 静态变量数组列表,java,Java,假设我有这个代码 public class Data { public static int x, y; // ... } // ... public static ArrayList<Data> myData = new ArrayList<Data>(); 问题是:静态前缀如何改变代码的行为? 我的意思是:myData是否总是由同一个对象填充,因为它的字段x和y被声明为静态的?或者myData是否总是由新对象填充? 换句话说:add()语句如何添加对
public class Data {
public static int x, y;
// ...
}
// ...
public static ArrayList<Data> myData = new ArrayList<Data>();
问题是:静态前缀如何改变代码的行为?
我的意思是:myData是否总是由同一个对象填充,因为它的字段x和y被声明为静态的?或者myData是否总是由新对象填充?
换句话说:add()语句如何添加对象?复制它
谢谢。它不会复制它。它只是将对象的引用添加到列表中 当你写作时
Data thisData = ...
thisData
是对您创建的Data
对象的引用。使用该引用将始终指向实例化的对象,除非明确复制该对象(通过复制构造函数、clone()
方法等)
因此,反复向列表中添加thisData
仅意味着有多个列表引用同一对象(或一个列表多次引用同一对象)。如果更改thisData
的成员,您将看到这一点。每个列表都将反映这一变化
注意这适用于对象。对于原语(
int
,long
等),复制值。当然,对于不可变对象(无法更改的对象),这并不重要。它不会复制它。它只是将对象的引用添加到列表中
当你写作时
Data thisData = ...
thisData
是对您创建的Data
对象的引用。使用该引用将始终指向实例化的对象,除非明确复制该对象(通过复制构造函数、clone()
方法等)
因此,反复向列表中添加thisData
仅意味着有多个列表引用同一对象(或一个列表多次引用同一对象)。如果更改thisData
的成员,您将看到这一点。每个列表都将反映这一变化
注意这适用于对象。对于原语(
int
,long
等),复制值。当然,对于不可变对象(无法更改的对象),这并不重要。现在,您的列表在对象的实例之间共享,使用静态
任何调用.add(thisData)
的实例;将向您的列表中添加数据现在您的列表在对象的实例之间共享,使用静态
任何调用.add(thisData)
的实例;将数据添加到列表中静态
意味着如果您的类的任何实例
访问myData
,或者如果您以.myData
的身份访问它,您将与同一ArrayList
对话,即它在您的类的所有实例之间共享
它与添加的内容无关
编辑:静态的x,y完全避开了我。在这种情况下,数据的所有实例将共享这两个变量,即它们的值将相同
这并不意味着它们是同一个实例,因为=
操作将返回false。另外,数据的任何其他变量
对于每个实例来说都是唯一的。静态
意味着如果您的类的任何实例
访问myData
,或者如果您以myData
的身份访问它,您将与相同的数组列表
对话,也就是说,它在类的所有实例之间共享
它与添加的内容无关
编辑:静态的x,y完全避开了我。在这种情况下,数据的所有实例将共享这两个变量,即它们的值将相同
这并不意味着它们是同一个实例,因为=
操作将返回false。另外,数据的任何其他变量
对于每个实例都将像往常一样是唯一的。数据数组的所有实例都将共享相同的字段x和y。任何修改的尝试都将传播到所有新创建的实例。那么为什么要在数组中有多个实例呢?数据数组的所有实例都将共享相同的字段x和y。任何修改的尝试都将传播到所有新创建的实例。为什么要在数组中有多个实例呢?它会将一个被静态变量引用的对象放在列表中。因此,如果不更改静态变量,它将始终放置相同的对象,如果创建由静态变量引用的新对象,它将添加新对象。但要小心,如果您使用一些setter来更改object的某些字段,这些setter将显示在列表中已添加的对象上。它会将您引用的静态变量对象放入列表中。因此,如果不更改静态变量,它将始终放置相同的对象,如果创建由静态变量引用的新对象,它将添加新对象。但要小心,如果您使用某些setter更改了object的某些字段,这些setter将显示在列表中已添加的对象上。这意味着arraylist实际上不起作用?它将包含同一静态对象的多个引用?您说原语是复制的。我的字段x和y不是这样吗?这意味着arraylist实际上不起作用?它将包含同一静态对象的多个引用?您说原语是复制的。这不是我的字段x和y的情况吗?是的,这是关于我的数据是静态的,但问题是关于静态字段x和y的行为。@BeppiMenozzi啊,我完全没有想到,我编辑了我的答案。是的,这是关于我的数据是静态的,但问题是关于静态字段的行为,x和y.@BeppiMenozzi啊,我完全不知道,我已经编辑了我的答案。