2014-07-22 34 views
27
class Hello12 { 
    static int b = 10; 
    static { 
     b = 100; 
    } 
} 

class sample { 
    public static void main(String args[]) { 
     System.out.println(Hello12.b); 
    } 
} 

In esecuzione sopra il codice l'output arriva come 100 perché quando ho chiamato classe Hello, il blocco statico viene eseguito prima impostando il valore di b su 100 e visualizzandolo. Ma quando scrivo questo codice:classi Java e blocchi statici

class Hello12 { 
    static { 
     b = 100; 
    } 
    static int b = 10; 
} 

class sample { 
    public static void main(String args[]) { 
     System.out.println(Hello12.b); 
    } 
} 

Qui l'uscita viene come 10. Mi aspetto risposta come 100 perché dopo l'esecuzione del blocco statico dava b il valore 100. così quando in main(), Ho chiamato Hello.b che avrebbe dovuto fare riferimento a b (= 100). In che modo la memoria è assegnata a b in entrambi i codici?

+3

+1. In pratica, usa 'final'. – djechlin

risposta

49

Nella "Procedura di inizializzazione dettagliata" per le classi, Section 12.4.2 of the JLS Uniti:

successivo, eseguire sia le inizializzatori classe variabili e inizializzatori statici della classe, o le inizializzatori di campo dell'interfaccia, in ordine testuale, come se fossero un singolo blocco.

Ciò significa che è come se il primo esempio era:

b = 10; 
b = 100; 

E il secondo esempio è stato:

b = 100; 
b = 10; 

dall'ultima assegnazione "vince", spiegando l'output.

+9

Questa deve essere la risposta accettata! –

+0

@kocko Va bene. Aiutiamo a ottenere rgettman il distintivo [Populist] (http://stackoverflow.com/help/badges/62/populist). Sfortunatamente, questo significa che la risposta accettata deve avere 10 upvotes ... – Justin

+5

Perché viene compilata se viene eseguita in 'ordine testuale'? Sicuramente 'b' non è stato dichiarato quando è impostato nel blocco statico? – Holloway

4

Le statistiche vengono valutate nell'ordine in cui appaiono nel programma.

16

I blocchi statici e le variabili statiche sono inizializzati nell'ordine in cui appaiono nella sorgente. Se il codice è:

class Hello12 { 

    static int b = 10; 
    static { 
    b = 100; 
    } 

} 

Il risultato è 100.

6

oltre a rispondere alla domanda di come il codice viene eseguito in quale ordine, vi sto indovinando anche voler sapere perché un blocco statico può riferirsi a una variabile statica che non è stata ancora dichiarata/eseguita testualmente.

Mentre section 12.4.2 of the JLS non spiegano che blocchi statici e variabili statiche vengono eseguiti nell'ordine testuale che appaiono, section 8.3.3 of the JLS spiega quando è possibile fare riferimento ciò, e si può vedere che la condizione di The use is not on the left hand side of an assignment; fallisce, permettendo al blocco statico nella seconda esempio per riferirsi a una variabile statica che non è stata ancora testualmente dichiarata/eseguita.

Problemi correlati