java - 静态变量的ArrayList

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

谢谢。

最佳答案

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

当你写的时候

Data thisData = ...

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

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

注意这适用于对象。对于原语(intlong 等),值被复制。当然,对于不可变对象(immutable对象)(无法更改的对象)来说,这无关紧要。

关于java - 静态变量的ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14579836/

相关文章:

java - 尝试在hibernate中使用SQL函数

java - 当 JFileChooser 上的文件路径无效时显示错误消息弹出窗口

java.io.FileNotFoundException : (Access is denied) AND Cast Issue

java - 如何让 maven swagger codegen 插件使用继承生成 Java 类?

java - 移动 ImageView 对象时的并发处理

java - 如何在从 <ui :repeat> 生成的 <tr> 中添加命令链接

java - 为什么会出现无限循环?关于 BigInteger.remainder()

java.lang.NullPointerException : Cannot get property 'grailsResourceProcessor' on null object

java - Android 中的 INSTALL_FAILED_CONFLICTING_PROVIDER

java - 连接数据库时出现空指针异常