2015-11-08 18 views
7

In Java, come farei quanto segue:impostare tutti i riferimenti di oggetto a null

Foo bar = new Foo(); 
Foo a = bar; 
Foo b = bar; 
bar = null;//will only set bar to null. want to set value of bar to null rather than the reference to null. 

E 'possibile impostare le variabili bar, a e b (tutti sono un riferimento a bar) a null solo con accesso alla barra? Se è così, qualcuno potrebbe spiegare come farlo.

+2

No , questo non è possibile in Java. Le regole sull'assegnazione delle variabili significano che devi usare il nome di una variabile da assegnare ad essa. – Nayuki

+0

Penso che quando si imposta la barra su null, anche aeb abbiano un riferimento null. O qual è il problema? –

+0

Si prega di leggere questo tutorial: http://www.javaranch.com/campfire/StoryPassBy.jsp – Nayuki

risposta

3

Questo non è possibile in Java. Non è possibile impostare il riferimento a e null utilizzando bar.

Motivo - Java è pass by value non pass by reference.

+11

Non penso che questa sia la ragione giusta. "passa per valore/riferimento" sono strategie di valutazione per le chiamate al metodo. Nessun metodo è chiamato qui. – xehpuk

5

No, non è possibile in Java.

Spiega un po 'cosa è successo nel tuo codice. Qui Foo bar = new Foo(); si è creato l'oggetto Foo e si è fatto riferimento alla variabile bar.

Qui Foo a = bar; e Foo b = bar; si inserisce il riferimento alle variabili a e b. Quindi ora hai un oggetto e tre variabili che puntano a lui.

Qui bar = null; si cancella la variabile bar. Quindi hai due variabili (a e b) che puntano all'oggetto e una variabile (bar) senza riferimento.

2

non c'è davvero un distruttore in Java come se ci si trova in C:

Se si sapeva che si voleva impostare più oggetti NULL, allora si sarebbe probabilmente utilizzare una schiera di Foo invece di dichiararli come oggetti separati. Quindi utilizzare i loop per le chiamate dei costitutori, instatiation/inizializzazione.

Foo bar = new Foo(); 
Foo array[2] 
for (int i=0; i<array.length; i++) { 
    array[i] = bar; 
} 

allora si potrebbe utilizzare un ciclo alla fine

for (int i=0; i<array.length; i++) { 
    array[i] = null; 
} 

Questa è la strategia che si vorrebbe per strutture di dati, perché è possibile gestire qualsiasi numero di oggetti, per la ricorsione ecc

+0

BTW, quando dici a = bar, stai copiando il valore di bar a a. la modifica della barra non cambierà i valori copiati in altre posizioni di memoria. So che le persone di matematica a volte suppongono che quel segno di uguale continua a essere vero dopo il fatto, in C e Java che è un doppio == è bi-simmetrico.Il singolo = è chiamato un compito che puoi pensare ad esso più come una freccia asimmetrica a sinistra. In Java quando si imposta un oggetto su null è l'equivalente C di chiamare un distruttore. –

+0

Re: "desidera impostare il valore di bar su null anziché il riferimento a null" Il valore ASCII 0 rappresenta letteralmente null, che per definizione è la fine di una stringa o di un oggetto (è per questo che usiamo chiamarli stringhe con terminazione nulla)). Quindi se il valore in memoria è stato modificato in null allora non sarebbe più un oggetto Foo, in quanto non avrebbe le funzioni membro necessarie, le variabili membro ecc. Come definito nella classe. –

Problemi correlati