È possibile che due variabili puntino allo stesso pezzo di memoria?

3

È possibile che due variabili puntino allo stesso pezzo di memoria?

Il mio professore ha scritto un breve frammento di codice dove ha creato una seconda istanza di una classe e gli ha assegnato un oggetto creato in precedenza e si riferiva a questo come due variabili che puntavano alla stessa posizione / informazioni nella memoria, il che mi ha lasciato abbastanza confuso

    
posta Kuchiki Byakuya 07.09.2017 - 02:16
fonte

2 risposte

8

Non esiste un nome oggetto in Java. Le classi hanno nomi come java.util.ArrayList . Ma le istanze di ArrayList sono oggetti senza nome. Li fai quando esegui il codice come new ArrayList() . Vivranno in diversi luoghi di memoria che ricordi con riferimenti. Quelli che dai nomi.

ArrayList al1 = new ArrayList(); // Object 1 being constructed at some address
ArrayList al2 = new ArrayList(); // Object 2 being constructed somewhere else
ArrayList al3 = al2;             // No object is being constructed here

Ecco 3 riferimenti. al1 si riferisce all'oggetto 1. al2 e al3 si riferiscono all'oggetto 2. Quindi puoi avere due riferimenti allo stesso oggetto. Ma quell'oggetto vive ancora solo in un posto, a un indirizzo. E ancora quelli non sono il nome dell'oggetto. Questi sono i nomi dei riferimenti che puntano a quell'oggetto.

La mia metafora preferita per questo è: puoi distribuire tutti i biglietti da visita con il tuo indirizzo di casa su di loro come preferisci, ma hai solo una casa. Puoi nominare ogni biglietto da visita (riferimento). Puoi nominare i progetti di casa (la classe) ma non puoi dare un nome alla casa reale (oggetto).

L'unico identificatore 1 a 1 che ha un oggetto è il suo indirizzo che non si vede mai in Java a meno che non si scriva un codice pazzo come questo .

Noi comuni mortali ci accontentiamo di usare riferimenti, hashcode e campi ID per tenere traccia di quale oggetto abbiamo. Sembra solo complicato perché lo è.

    
risposta data 07.09.2017 - 02:37
fonte
17

Can a single object in Java have two distinct names?

In Java, gli oggetti non hanno nomi, hanno riferimenti.

Le variabili di tutti i tipi hanno nomi, ma le variabili sono distinte dagli oggetti. Le variabili possono fare riferimento agli oggetti.

Is it possible for two object names references to point to the same object (i.e. piece of memory) ?

Sì, due o più riferimenti, ad esempio da parametri e / o variabili locali e / o variabili di istanza e / o variabili statiche possono fare riferimento allo stesso oggetto.

Questo è ciò che accade quando copi una variabile che è un tipo di oggetto (per semplice assegnazione, ad esempio a = b; ): il riferimento viene copiato, cioè duplicato - mentre l'oggetto stesso non è influenzato da tale assegnazione (è solo influenzato da ciò che potresti fare in seguito con il riferimento). Con tale assegnazione la nuova variabile, assegnazione del post, si riferisce allo stesso oggetto e il riferimento della vecchia variabile continua a rimanere valido.

Questo stesso tipo di copia di riferimento avviene durante il passaggio dei parametri, che è proprio come l'assegnazione.

Naturalmente, qualsiasi riferimento (attivo) impedisce che l'oggetto venga raccolto.

Un riferimento valido è uno che è ancora in ambito o raggiungibile da qualcosa che è ancora in ambito. Quando una funzione termina, tutte le sue variabili e parametri locali escono dall'ambito di applicazione, rilasciando eventuali riferimenti a quelli in attesa.

    
risposta data 07.09.2017 - 02:27
fonte

Leggi altre domande sui tag