java - 两个新创建的对象似乎指向同一个地址
问题描述
我只用了几个月的 Java 编程,所以我对 Java 的经验并不那么丰富(一些技巧和我应该知道的基本知识)。
我遇到了一个可能很明显但我没有看到的问题。
public class SomeClass {
private final int[] numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
private LabelText AText = new LabelText('A', numbers);
private LabelText BText = new LabelText('B', numbers);
public void foo() {
AText.numbers[6] = -1;
BText.numbers[3] = -1;
if (BText.numbers[6] == -1) System.out.println("Wtf?");
}
}
这是我的代码的摘录。
这怎么可能是真的?这是两个独立的对象。我不明白。
foo 方法在我的 main 方法中直接调用(用于测试目的)。
如果你需要LabelText的构造函数,这里是:
public class LabelText {
private final char letter;
public int[] numbers;
public LabelText(char letter, int[] numbers) {
this.letter = letter;
this.numbers = numbers;
}
}
解决方案
因为您在没有复制的情况下传递了一个引用,numbers
所以两个对象最终都指向同一个 int[]
实例。虽然有两个不同的外部对象,但它们都指向的内部对象是同一个 object,因此您可以通过取消引用 ofAText.numbers
和来更改该内部对象,并且在访问两个外部对象的字段BText.numbers
时,更改将在两个外部对象中可见numbers
.
您可以检查AText == BText
将返回false
,但AText.numbers == BText.numbers
会返回true
。而且this.numbers == AText.numbers
还会回来true
。
就像尝试相同的代码,但使用这个构造函数:
public LabelText(char letter, int[] numbers) {
this.letter = letter;
this.numbers = numbers.clone(); // so it will always be unique array here
}
推荐阅读
- vaadin - 如何在 Vaadin 13 中调整网格中行的大小?
- c# - 更改为随机背景导致 android 滞后
- sql-server - SQL Server int 和 MS Access VBA long 数据类型之间的数据类型转换错误
- r - 如何从列表中生成百分比的数据框摘要
- azure - 在哪里可以找到 databricks 工作区的日志?
- c++ - 在任何类类型的模板方法中使用 new
- ionic3 - Ionic 3 从子页面的根页面运行功能
- kubernetes - 如何在 Windows 中访问 Kubernetes 集群中的 pod?
- javascript - 如何使用jquery修复div中的多个附加
- angular - Angular 应用程序未在 ie 11 中呈现并给出 SecurityError 和 SyntaxError