2013-02-06 12 views
5

Hi stackoverflow members, Ecco una piccola domanda relativa al significato effettivo di "tempo di caricamento della classe".Classe Tempo di caricamento in Java

Ad esempio il codice seguente:

public class Sequence { 
    Sequence() { 
     System.out.print("c "); 
    } 
    { 
     System.out.print("y "); 
    } 
    public static void main(String[] args) { 
     System.out.println("Indeed"); 
     new Sequence().go(); 
    } 
    void go() { 
     System.out.print("g "); 
    } 
    static { System.out.println("x "); } 
} 

Fa stampare prima "x" che è statico quindi i blocchi init statici vengono sempre caricati in "tempo di classe loading". Ho capito, ma sai esattamente quando avviene questo tempo di caricamento? Ho pensato che quando la classe viene chiamata per la prima volta nel metodo principale creando il primo oggetto, ma in quel caso il risultato avrebbe dovuto essere diverso stampando prima "Indeed". Chiunque può aiutarmi a chiarire questo dubbio? Ho controllato altri post parlando di questo argomento in generale, ma ritengo comunque che sarebbe molto più chiaro (almeno per me) sapere esattamente quando, nel codice riportato sopra, si verifica il "tempo di caricamento della classe".

Grazie in anticipo.

+0

Ancora una volta per essere più chiaro, conosco l'output di questo piccolo programma e so perché emette questo output. Tuttavia mi piacerebbe sapere quando accade esattamente il "tempo di caricamento della classe". – Rollerball

+1

'Mi piacerebbe sapere quando si verifica esattamente il" tempo di caricamento della classe "ogni volta che la classe viene caricata in JVM. :) – PermGenError

+0

penso che non dovresti preoccuparti di questi lavori JVM di base, tranne che ottieni una ClassNotFoundException – duffy356

risposta

3

La risposta alla tua domanda è in JLS Chapter 12.4.1 When Initialization Occurs

Una classe o interfaccia tipo T verranno inizializzate immediatamente prima del primo verificarsi di uno qualsiasi dei seguenti:

  • T è un classe e viene creata un'istanza di T.
  • T è una classe e un metodo statico dichiarato da T viene richiamato.
  • Viene assegnato un campo statico dichiarato da T.
  • Viene utilizzato un campo statico dichiarato da T e il campo non è una variabile costante (§4.12.4).
  • T è una classe di livello superiore (§7.6) e viene eseguita un'istruzione di asserzione (§14.10) annidata lessicale entro T (§8.1.3).

vi consiglio di iniziare a leggere qualche riga sopra al JLS Chapter 12.4. Initialization of Classes and Interfaces

Basta partire con Chapter 12. Execution, descrive esattamente quando una classe deve essere caricato. L'inizializzazione verrà eseguita dopo averla caricata.

3

come metodo main si trova nel classe Sequence, che ha bisogno di essere caricato dalla JVM prima. Quindi è perfettamente logico che "x" sia la prima cosa da stampare.

3

hai ragione, blocco statico sono run quando la classe viene caricata. E questo succede nel tuo caso quando esegui il programma. perché il metodo principale si trova all'interno della classe Sequence, quindi l'uscita x che precede lo Indeed è corretta.

1

La classe Sequence deve essere caricato prima che il metodo main viene richiamato da JVM, che provoca l'initialialization statica a prendere posto e quindi, perché x è la prima cosa da stampare.

2

Non è vero che il blocco di init statico venga eseguito in fase di caricamento della classe. Eseguono al tempo di inizializzazione della classe . Il punto preciso nel tempo in cui il primo accade non è specificato, mentre c'è una specifica rigorosa per il secondo: succede al primo accesso di runtime di una classe.

Problemi correlati