2011-12-18 11 views
13

Si dice che i blocchi statici in java girino una sola volta quando viene caricata quella classe. Ma cosa significa in realtà? A che punto è una classe caricata da JVM (Java Virtual Machine)?Cosa significa in realtà "Quando una classe è caricata"?

È quando viene chiamato il metodo principale in quella classe? Ed è che tutte le super classi della stessa classe vengono caricate anche quando il metodo principale inizia l'esecuzione?

Si consideri che A estende B e B estende C. Tutti hanno blocchi statici. Se A ha il metodo principale, quale sarà la sequenza di esecuzione dei blocchi statici?

risposta

9

Questo è descritto nella sezione Execution di JLS. Vale a dire:

L'inizializzazione di una classe consiste nell'eseguire i suoi inizializzatori statici e gli inizializzatori per i campi statici dichiarati nella classe. L'inizializzazione di un'interfaccia consiste nell'eseguire gli inizializzatori per i campi dichiarati nell'interfaccia.
Prima di inizializzare una classe, la sua superclasse diretta deve essere inizializzata, ma le interfacce implementate dalla classe non devono essere inizializzate. Allo stesso modo, le superinterfacce di un'interfaccia non devono essere inizializzate prima che l'interfaccia sia inizializzata.

Quindi nel tuo esempio, il blocco statico del "più in alto" di classe (C) corre, poi quella di B, poi quello più-derivata.

Vedere questa documentazione per una descrizione dettagliata di tutti i passaggi necessari per il caricamento di una classe.

(. Classi vengono caricati quando loro prima utilizzazione attivamente)

1

Dal Java Language Specification:

inizializzazione di una classe consiste di eseguire le sue inizializzatori statici e gli inizializzatori per i campi statici (variabili di classe) dichiarato nella classe. L'inizializzazione di un'interfaccia consiste nell'eseguire gli inizializzatori per i campi (costanti) dichiarati lì.

Prima di inizializzare una classe, è necessario inizializzare la sua superclasse, ma le interfacce implementate dalla classe non vengono inizializzate. Allo stesso modo, le superinterfacce di un'interfaccia non vengono inizializzate prima che l'interfaccia sia inizializzata.

Il processo è descritto in dettaglio nello Java Virtual Machine Specification.

1

penso che il seguente esempio risolverà tutti i vostri problemi:

Prima di una classe viene inizializzato, le sue superclassi vengono inizializzati, se non sono stati precedentemente inizializzato.

Così, il programma di test:

class Super { 
     static { System.out.print("Super "); } 
} 
class One { 
     static { System.out.print("One "); } 
} 
class Two extends Super { 
     static { System.out.print("Two "); } 
} 
class Test { 
     public static void main(String[] args) { 
       One o = null; 
       Two t = new Two(); 
       System.out.println((Object)o == (Object)t); 
     } 
} 

stampe:

Super Two false 

La classe One non si inizializza mai, perché non utilizzato attivamente e quindi non è mai collegato.La classe due viene inizializzata solo dopo l'inizializzazione della superclasse Super.

Per maggiori dettagli visitare questo link

Modifica dettagli: linee confuse rimosso.

+0

'Subito dopo l'avvio di JVM' non è una descrizione accurata di questo processo. Guarda le altre risposte. Downvote. – EJP

+0

Rimosso quelle linee confuse –