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.