2011-07-23 1 views
5

Perdonami se questo è un duplicato, non riesco a trovare nulla che spieghi ciò che sto vedendo bene.java null reference copy

Il seguente programma:

Object a = new Object(); 
    Object b = a; 

    System.out.println("a: " + a); 
    System.out.println("b: " + b); 

    a = null; 

    System.out.println("a: " + a); 
    System.out.println("b: " + b); 

rendimenti questo:

a: [email protected] 
b: [email protected] 
a: null 
b: [email protected] 

Ma PERCHE '?!? Sono così confuso da questo. Non dovrebbe "b" fare riferimento a "a"? Pertanto, se "a" non fa più riferimento a qualcos'altro (es: null) allora non dovrebbe "b"? Mi manca ovviamente qualcosa di fondamentale qui.

Grazie in anticipo.

EDIT # 1

Penso che quello che mi ha buttato fuori era sto stampando l'indirizzo. Per qualche ragione, nella mia mente, stavo stampando un po 'di valore magico che indica i puntatori \ riferimenti - quando in realtà l'impostazione b = a non li sta rendendo uguali, sta semplicemente creando un nuovo puntatore allo stesso punto sull'heap. Spero che questo aiuti qualcun'altro.

risposta

8

b non fa riferimento a a facendo riferimento allo stesso oggetto a fa riferimento a quando è stato eseguito l'assegnazione.

So che questo non è lo stesso linguaggio, ma se si ha familiarità con C, è come:

int someNum = 5; 
int * a = &someNum; // a points to someNum 
int * b = a; // b points to someNum too 
a = NULL; // a doesn't point to anything (points to address 0), b still points to someNum 

(ho usato C in quanto dà uno sguardo più chiaro di indirizzi e riferimenti)

+0

Grazie. Di gran lunga la spiegazione più chiara - sapevo che mi mancava qualcosa di abbastanza ovvio; o forse avevo bisogno di un aggiornamento, DOH! – javamonkey79

+0

Sono contento che sia venuto fuori chiaro :) – MByD

1

Sia a che b sono riferimenti all'istanza di oggetto creata. Significa che entrambi puntano alla stessa area di memoria. Quindi distruggi uno di questi riferimenti. Ora un punto a null. Ma sia l'oggetto che il secondo riferimento ad esso sono vivi. Questo è ciò che vedi.

4

consente di dare uno sguardo dettagliato a ciò che sta accadendo:

//A is pointing to a new Object lets assume memory location for 1 for simplicity 
Object a = new Object(); 
//B is now also pointing to memory location 1 
    Object b = a; 

//Both print the same they are both pointing to memory location 1 
    System.out.println("a: " + a); 
    System.out.println("b: " + b); 

//a is now pointing to null, but there is no change to b which is still pointing to memory location 1 
    a = null; 

    System.out.println("a: " + a); 
    System.out.println("b: " + b); 
1

un riferimento a un nuovo oggetto (Object a = new Object())
b fa riferimento allo stesso oggetto come un (Object b = a)
una riferimenti nulla (a=null)
b fa ancora riferimento all'oggetto

2
Object a = new Object(); 

Questo li ne crea un nuovo oggetto sull'heap e inserisce un riferimento nella variabile a.

Object b = a; 

Java è passare per valore, per cui questa linea passa/assegna il valore di tale riferimento nella variabile b.

a = null; 

Ciò significa la variabile a dovrebbe puntare più in quel posto sul mucchio, ma dovrebbe puntare da nessuna parte.Ma non dovrebbe significare che il punto b non ha alcun luogo, dal momento che abbiamo passato il riferimento per il valore, quindi b punta ancora a quell'oggetto nell'heap.

L'osservazione chiave qui è pass-by-value. Dato che essenzialmente abbiamo fotocopiato il valore di a in b, la modifica dell'originale non avrà alcun effetto su come appare la fotocopia dal momento che è già stata scattata.

3

Java passa sempre per valore, questo è tutto.

0

null non è premitive ed è considerato come oggetto, in modo che quando si chiama a = null, a sarà fare riferimento a nulla, mentre b ancora riferendosi allo stesso oggetto new Object()