gpt4 book ai didi

java - 两个新创建的对象似乎指向同一个地址

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:31:35 24 4
gpt4 key购买 nike

我只用了几个月的 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?");
}
}

这是我的代码的摘录。

这怎么可能是真的?这是两个独立的对象。我不明白。

在我的 main 方法中直接调用了 foo 方法(用于测试目的)。

如果你需要LabelText的构造函数,这里是:

public class LabelText {

private final char letter;
public int[] numbers;

public LabelText(char letter, int[] numbers) {
this.letter = letter;
this.numbers = numbers;
}
}

最佳答案

因为您将 reference 传递给 numbers 而没有制作副本,所以两个对象最终都指向相同的 int [] 实例。虽然有两个不同的外部对象,但它们都指向的内部对象是同一个对象,因此您可以通过取消引用任一AText 来更改该内部对象.nu​​mbersBText.numbers,当访问它们的 numbers 字段时,更改将在两个外部对象中可见。

您可以检查 AText == BText 将返回 false,但 AText.numbers == BText.numbers 将返回 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
}

关于java - 两个新创建的对象似乎指向同一个地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51717223/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com