2013-03-15 12 views
9

Uno dei miei amici mi ha chiesto che caricherà prima la variabile statica o il blocco statico.Quale sarà caricato prima la variabile statica o il blocco statico?

La mia risposta punta alla variabile statica.

Così mi ha dato due equazioni e disse di distinguere tra loro
prima equazione

public class Some { 
    public static void main(String args[]) 
    { 
     System.out.println(Some.x); 
    } 
    static { 
     System.out.println(Some.x); 
    } 
    static int x=90; 
} 

O/P: 0 90

seconda equazione

public class Some { 
    public static void main(String args[]) 
    { 
     System.out.println(Some.x); 
    } 
    static int x=90; 
    static { 
     System.out.println(Some.x); 
    } 
} 

O/P: 90 90

Ho provato a decompilare il codice byte e ho trovato lo stesso per entrambe l'equazione di cui sopra. Per favore aiutami a distinguere tra loro. Sono confuso quando la variabile statica verrà inizializzata.

+3

Le cose statiche vengono eseguite in sequenza, nell'ordine in cui è definita nella classe. –

+0

Sei sicuro che il codice byte sia lo stesso? Mi sarei aspettato che le dichiarazioni comparissero in un ordine diverso e, come sottolinea @Sudhanshu, l'ordine di dichiarazione è importante. –

+0

@PatriciaShanahan ya per entrambi il codice byte equazione è lo stesso. – Hablu

risposta

1

variabili statiche e blocchi statici vengono eseguiti in un ordine in cui appaiono.

qui prima O/P: 0 90 come nella System.out.println(Some.x); istruzioni del blocco statico eseguito dopo l'istruzione di inizializzazione variabile statica static int x=90;

+0

Spazzatura. Il piegamento costante viene eseguito dal compilatore, non dalla JVM. JVM esegue inizializzatori e blocchi di variabili statiche nell'ordine testuale che compaiono nel file sorgente. Non prima le variabili e poi i blocchi. – EJP

+0

Modificato, ci scusiamo per l'inconveniente e grazie. –

-1

variabili statiche vengono eseguite quando la JVM carica la classe e la classe viene caricato quando è stato istanziato o viene chiamato il suo metodo statico.

Il blocco di inizializzazione statico viene inizializzato prima dell'istanza della classe o prima che venga chiamato il suo metodo statico e anche prima che venga utilizzata la sua variabile statica.

-1

sto dando un semplice esempio per il controllo del flusso di statico e stoffe esempio:

Supponiamo di avere 2 clases A e B. classe A si estende alla categoria B. e la classe B ha un metodo main.Dopo la compilazione con successo sia il comando su cmd è come:

java B 

Ora cosa accadrà vedere passo dopo passo:

  1. classi A e B saranno caricati
  2. membri statici e blocchi della classe A sarà identificato e sarà eseguito sequenzialmente (uno per uno) (ma solo una volta al momento del caricamento della classe)
  3. membri statici e blocchi di classe B saranno identificati ed eseguiti (uno per uno) (Ma solo una volta al momento della lezione caricamento)
  4. verrà invocato il metodo principale della classe B (Nel caso in cui la classe B non abbia un metodo principale, verrà invocato il metodo principale della classe A)
  5. Non appena verrà creato un oggetto di classe A: tutto esempio membri inizializzazione e l'esecuzione del blocco esempio saranno condotti in classe a
  6. costruttore della classe a (che è stato utilizzato per la creazione oggetto) sarà essere eseguito
  7. Se si crea un oggetto della classe B: tutte le istanze l'inizializzazione dei membri e l'esecuzione del blocco di istanze verrà eseguita in classe A.
  8. costruttore della classe A (costruttore predefinito o qualsiasi altro se si chiama dal costruttore di B) sarà essere eseguito

  9. allora tutto istanza membri inizializzazione e l'esecuzione del blocco istanza sarà fatto in classe B

  10. e dopo che verrà eseguito il costruttore di classe B (che è stato utilizzato per creare oggetto)

Nota: i membri statici e blocchi esecuzione viene eseguito una sola volta durante il caricamento della classe per la prima volta, mentre i membri dell'istanza e i blocchi di istanze vengono eseguiti ogni volta quando viene creato un oggetto della classe. Per favore fatemi sapere se non sono corretto.

+0

"La Classe A si estende alla classe B" è ambigua al massimo, o insignificante nella peggiore delle ipotesi. Se intendi che A si estende a B la maggior parte della tua risposta è sbagliata. – EJP

+0

Non potevo prenderti, per favore spiega il tuo punto. –

+0

Non credo di poterlo fare. Mi sembra già perfettamente chiaro. Devi chiarire la dichiarazione che ho citato. – EJP