Multiple Stesso Istanziamento dell'oggetto

8

Che cosa succede esattamente in Java quando istanzia lo stesso oggetto più volte?

Ad esempio:

Test test = new Test();

poi in seguito lo chiamerò di nuovo, Test test = new Test(); di nuovo o all'interno di un ciclo. La precedente istanziazione sarà eliminata?

    
posta userIsAMonkey 14.08.2012 - 07:35
fonte

3 risposte

16
  1. ogni chiamata new Test() crea una nuova istanza di oggetto della classe Test
  2. test = new Test(); assegna un riferimento di quell'oggetto alla variabile test
  3. Un'istruzione ripetuta test = new Test() crea una seconda istanza di Test e assegna di nuovo il riferimento alla variabile test , quindi il primo riferimento viene sostituito.

Se e quando la prima istanza sarà eliminata, tuttavia, dipende. L'ambiente di runtime Java traccia riferimenti, quindi finché ci sono riferimenti a un oggetto in uso, l'oggetto non verrà eliminato. Ad esempio, se tra il passaggio 2 e il passaggio 3 il riferimento alla prima istanza viene memorizzato da qualche altra parte (come Test test2 = test; ), e tale variabile è ancora nell'ambito quando si verifica il passaggio 3, quindi il primo oggetto non è disposto, poiché test2 ha ancora un riferimento ad esso. Tuttavia, quando non esiste tale affermazione e il passaggio 3 omette il riferimento univoco al primo oggetto, allora si verificherà l'eliminazione di quell'oggetto.

Si noti che lo smaltimento non avviene immediatamente, ma a volte in un secondo momento, quando viene eseguito il garbage collector. Ma questo è indipendente dalla semantica del codice discusso, questo è solo una questione di memoria e prestazioni.

    
risposta data 14.08.2012 - 08:03
fonte
4

1: Alcune parole: Non istanziamo affatto gli oggetti, istanziamo le classi e il prodotto di un'istanza di classe è un oggetto (chiamato anche un'istanza). Ovviamente possiamo istanziare una classe tante volte quanto è necessario per creare un nuovo oggetto diverso con ogni istanza.

2: In ogni caso, non puoi avere il codice che suggerisci:

Test test = new Test();
Test test = new Test();

nessuno dei due può avere questo:

for (i=0; i<3; i++) {
    Test test = new Test();
    Test test = new Test();
}

Nessuno verrà compilato, poiché la parte Test test è la dichiarazione della variabile test (di tipo Test ), e nessuna lingua, incluso Java, consente di dichiarare due volte la stessa variabile nello stesso ambito.

Tuttavia puoi assegnare più volte la stessa variabile (come suggerisce il nome), con oggetti diversi, come questo:

Test test = new Test();
test = new Test();

La prima riga dichiara test e assegna un oggetto appena creato. La seconda riga assegna a test un altro oggetto, anch'esso appena creato.

Nota inoltre che i collegamenti sono consentiti in Java:

for (i=0; i<3; i++) {
    Test test = new Test();
}

Questo ciclo non dichiarerà test 3 volte. Si intende assegnare tre nuovi oggetti diversi in sequenza alla variabile test che sarà dichiarata una sola volta. (confronta con il ciclo precedente).

3: Cosa succede alla variabile test e ai due oggetti di tipo Test ?

La variabile test viene prima assegnata al riferimento di un oggetto, quindi di un altro oggetto. Una variabile conserva solo l'ultimo riferimento assegnato.

Il primo oggetto di tipo Test non è più assegnato a test . Se a nessun'altra variabile è stato assegnato il suo riferimento, allora questo oggetto non può essere in alcun modo accessibile dal programma, e quindi è inutile. È reso idoneo alla garbage collection dal sistema. Ad un certo punto nel tempo il sistema (la JVM) eseguirà il suo garbage collector che lo cancellerà dalla memoria.

Il secondo oggetto vivrà fintanto che almeno una variabile lo fa riferimento, quindi il garbage collector si prenderà cura di esso e lo porterà al Cimitero degli oggetti senza riferimento. Questa è la vera vita degli oggetti Java: - (

    
risposta data 06.04.2014 - 18:07
fonte
-1

Risposta breve: tutti gli oggetti creati in precedenza verranno eliminati se nessuno li indirizza. Esiste solo il più recente perché il test lo fa riferimento.

    
risposta data 14.08.2012 - 23:19
fonte

Leggi altre domande sui tag