Membri statici e finalizzare ()

-2

Se abbiamo uno snippet di codice come:

public class Finalizer{
    static List list = new ArrayList();

    public void finalize( ){
        System.out.println("hello");
    }
}

Che cosa c'è di così speciale riguardo alla static qui che influenza la chiamata a finalize (). È perché i membri statici hanno un ciclo di vita dell'intero programma, quindi una variabile che si riferisce all'oggetto Finalizer non sarà fuori portata a causa della staticità a meno che non diciamo nulla su di essa?

    
posta user1369975 08.10.2016 - 11:04
fonte

3 risposte

4

Non c'è niente di speciale nei membri statici qui. Il metodo finalize viene chiamato su un oggetto quando l'oggetto viene sottoposto a garbage collection. Un oggetto viene sottoposto a garbage collection quando l'oggetto non è più raggiungibile da alcuna parte dell'applicazione.

L'unica differenza è che i membri statici sono raggiungibili per un periodo di tempo più lungo a causa del modo in cui vengono referenziati. A un membro statico viene fatto riferimento da una classe mentre la classe fa riferimento al relativo programma di caricamento classi. La maggior parte dei programmi di caricamento di classi hanno una lunga durata (il caricatore di classi bootstrap dura finché la JVM è in esecuzione) e raramente diventano idonei per la raccolta di dati inutili, quindi per questo motivo i membri statici sono ancora referenziati molto tempo dopo che tutte le istanze di quella classe sono state spazzatura raccolte.

Quindi list nel tuo esempio non è legato alle istanze della tua classe Finalizer , è legato alla classe Finalizer stessa. Il campo e le istanze della classe sono garbage collection separate, il static non influenza la chiamata a finalize per le istanze della classe.

Un'altra cosa a cui prestare attenzione nel caso in cui non lo sapessi, i finalizzatori potrebbero non essere mai eseguiti se il garbage collector non viene mai eseguito. Se disponi di molta memoria e di una piccola applicazione di breve durata, il garbage collector potrebbe non occuparsi di recuperare memoria prima dell'esistenza dell'applicazione.

    
risposta data 08.10.2016 - 14:01
fonte
3

What is so special about static here that affects the call to finalize ( )

I due sono completamente indipendenti e non si influenzano a vicenda.

Is it because that static members have lifecycle of whole program so a variable referring to the Finalizer object won't be out of scope because of static unless we say null on it?

No, i membri statici sono completamente estranei alle istanze dell'oggetto. Avere list come membro statico non interromperà le istanze di Finalizer che vengono raccolte informazioni inutili, se necessario.

    
risposta data 08.10.2016 - 12:29
fonte
-1

Niente di veramente, ma diventa più interessante se si ha il codice qui sotto, dato che ogni istanza di Finalizer sarà tenuta in memoria per l'intera vita del programma, senza essere trucchiata.

public class Finalizer{
    static List list = new ArrayList();
    public void finalize( ){
        list.add(this); // Do not try this.        
    }
}
    
risposta data 11.09.2018 - 20:36
fonte

Leggi altre domande sui tag