Dos objetos recién creados parecen referirse a la misma dirección

DarkBarbarian:

Estoy programando en Java por sólo unos pocos meses, así que no soy tan experimentado con Java (algunos trucos y las cosas básicas que debería saber, sin embargo).

Tengo un problema que puede ser obvio, pero yo no lo veo.

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?");
   }
}

Este es un extracto de mi código.

¿Cómo puede ser esto cierto? Estos son dos objetos separados. Yo no lo entiendo.

El método se llama foo directamente en mi método principal (para propósitos de prueba).

Si necesita el constructor de labelText, aquí está:

public class LabelText {

   private final char letter;
   public int[] numbers;

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

Debido a que usted está pasando una referencia a numberssin hacer una copia, por lo tanto los objetos terminan apuntando a la misma int[] instancia . Mientras que hay dos diferentes objetos externos, el objeto interno que ambos punto a es el mismo objeto , por lo tanto, puede cambiar que objeto interno por eliminación de referencias cualquiera de AText.numbersy BText.numbers, y el cambio será visible en ambos de los objetos externos al acceder a sus numberscampos .

Se puede comprobar que AText == BTextvolverá false, pero AText.numbers == BText.numbersvolverá true. Y this.numbers == AText.numberstambién volverá true.

Al igual que probar este mismo código, pero con este constructor:

public LabelText(char letter, int[] numbers) {
   this.letter = letter;
   this.numbers = numbers.clone(); // so it will always be unique array here
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=137207&siteId=1
Recomendado
Clasificación