2013-04-05 17 views
9

Sembra intuitivamente chiaro che in Java, instance variable intitializers vengono eseguiti nell'ordine in cui compaiono nella dichiarazione di classe.Ordinamento di inizializzatori variabili di istanza

Questo sembra essere il caso nel JDK che sto usando. Ad esempio, la seguente:

public class Clazz { 
    int x = 42; 
    int y = this.z; 
    int z = this.x; 
    void print() { 
     System.out.printf("%d %d %d\n", x, y, z); 
    } 
    public static void main(String[] args) { 
     new Clazz().print(); 
    } 
} 

stampe 42 0 42 (in altre parole, y preleva il valore predefinito di z).

Questo ordine è effettivamente garantito? Ho esaminato il JLS e non ho trovato alcuna conferma esplicita.

+3

al momento in cui 'y' è assegnato,' z' non è ancora inizializzato, quindi mostra '0'. – Raptor

+3

@ShivanRaptor: Questa è esattamente la mia intuizione. La domanda è se questo è formalmente specificato dal JLS. – NPE

risposta

6

Sì, lo è.

Il SE7 JLS copre esempio ordine di inizializzazione variabile nella sezione 12.5 Execution:

...
4. Eseguire inizializzatori istanza e istanza inizializzatori variabili per questa classe, assegnando i valori di istanza variabili initializers alle corrispondenti variabili di istanza, nell'ordine da sinistra a destra in cui appaiono testuali nel codice sorgente per la classe. Se l'esecuzione di uno di questi inizializzatori provoca un'eccezione , non vengono elaborati ulteriori inizializzatori e questa procedura si completa improvvisamente con la stessa eccezione. In caso contrario, proseguire con il punto 5.
...

the JLS for Java 5 menzioni nella sezione "Classi":

Gli inizializzatori statici e classe inizializzatori variabili vengono eseguiti in modo testuale.

+0

Questo è tutto, grazie. – NPE

0

sì l'inizializzazione delle variabili nella classe viene eseguita nello stesso ordine. Quindi nella tua seconda riga y assume il valore predefinito di z poiché z non è inizializzato

Problemi correlati