Perché l'assegnazione di un oggetto a un altro li collega ma lo stesso non vale per le stringhe

1

Ho creato una classe chiamata Test con un costruttore e una variabile di istanza String name :

class Test {

    String name;

    Test(String name){
        this.name = name;
    }

}

L'ho istanziato in questo modo:

    Test first = new Test("First");
    Test second = first;

    first.name = "Change First";
    System.out.println("First: " + first.name);
    System.out.println("Second: " + second.name);

... e prevedibilmente ottieni questo:

First: Change First
Second: Change First

Questo ha senso per me. Sto assegnando il secondo oggetto alla stessa locazione di memoria referenziata nel primo - quando cambio il primo, il secondo cambia e viceversa.

Prendi questo:

    String x = new String("Hello");
    String y = x;

    x = new String("Change");
    System.out.println("x: " + x);
    System.out.println("y: " + y);

Quanto sopra fornisce l'output:

x: Change
y: Hello

Perché è questo? Entrambi stanno estendendo la classe Object , quindi perché si comportano in modo così diverso? Qualche altra derivata di Object si comporta in questo modo?

    
posta Nanor 01.05.2018 - 15:41
fonte

2 risposte

2

Cambia il tuo codice in:

Test first = new Test("First");
Test second = first;

first = new Test("First");
first.name = "Change First";
System.out.println("First: " + first.name);
System.out.println("Second: " + second.name);

E otterrai:

First: Change First
Second: First

Non ha niente a che fare con il fatto che sia una corda contro un oggetto. Stai cambiando a quale oggetto x punta con x = new String("Change"); , invece di modificare il contenuto dell'oggetto originale. Con first.name = "Change First"; non stai cambiando l'oggetto a cui punta; stai modificando il contenuto dell'oggetto.

Poiché le stringhe sono immutabili in Java, non è possibile cambiarne il contenuto; sostituirai sempre il riferimento.

    
risposta data 01.05.2018 - 15:45
fonte
2

I'm assigning the second Object to the same memory location referenced in the first

Non c'è "secondo oggetto". first e second non sono oggetti. Sono oggetti riferimenti . Il tuo programma ha creato un oggetto quando ha chiamato new Test("First") e ha memorizzato un riferimento a quell'oggetto nella variabile first . Quindi ha copiato il valore della variabile first (ad esempio, ha copiato il riferimento ) nella variabile second .

A quel punto, ciascuna delle due variabili si riferisce allo stesso oggetto e quando il tuo programma ha eseguito first.name = "Change First"; , ha modificato quell'unico oggetto.

[so, explain this...]

String x = new String("Hello");
String y = x;

x = new String("Change");
System.out.println("x: " + x);
System.out.println("y: " + y);

Il tuo secondo esempio crea due oggetti. Ha creato il primo quando ha chiamato new String("Hello") . Poi ne ha creato un altro quando ha chiamato new String("Change") .

Ancora una volta, x e y non sono oggetti String . Sono oggetti riferimenti . Il tuo secondo esempio lascia x con un riferimento al secondo String che ha creato e lascia y con un riferimento al primo.

    
risposta data 01.05.2018 - 18:07
fonte

Leggi altre domande sui tag