首页 > 解决方案 > 两个新创建的对象似乎指向同一个地址

问题描述

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

标签: java

解决方案


因为您在没有复制的情况下传递了一个引用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
}

推荐阅读