2013-05-19 18 views
23

Analizzando alcuni scenario strano nel seguente blocco statico:java: l'accesso a variabili statiche all'interno statico blocco

static { 
    System.out.println("Inside Static Block"); 
    i=100; // Compilation Successful , why ? 
    System.out.println(i); // Compilation error "Cannot reference a field before it is defined" 
} 

private static int i=100; 

Mentre stesso codice sta lavorando bene durante l'utilizzo:

static { 
    System.out.println("Inside Static Block"); 
    i=100; // Compilation Successful , why ? 
    System.out.println(MyClass.i); // Compiles OK 
} 

private static int i=100; 

Non certo perché variabile di inizializzazione non lo fanno bisogno di accesso variabile usando il nome della classe mentre SOP richiede?

+0

intendevi mostrare un errore in entrambi i blocchi? – Bohemian

+1

@Bohemian Penso che questo sia un errore di copia/incolla. Il secondo blocco non dovrebbe mostrare errori. –

+0

vedere anche http://stackoverflow.com/questions/15820302/recursive-initializer-works-when-i-add-this – ZhongYu

risposta

10

Questo a causa dello restrictions on the use of Fields during Initialization. In particolare, l'uso di campi statici all'interno di un blocco di inizializzazione statico prima della riga su cui sono dichiarati può essere solo sul lato sinistro di un'espressione (ad esempio un'assegnazione), a meno che non siano pienamente qualificati (nel tuo caso MyClass.i).

Quindi, ad esempio: se si inserisce subito dopo i = 100; si otterrebbe lo stesso errore.

Il modo ovvio per risolvere il problema è dichiarare static int i;prima del blocco di inizializzazione statico.

+0

+1 Cool. Non lo sapevo, né l'ho incontrato. Inoltre non posso credere che mi ci sia voluto così tanto tempo per capire il tuo nome:/ – Bohemian

+0

@Bohemian Mi chiedo che cosa hai capito. – assylias

+3

Che non sei così sciocco come prima sembra :) – Bohemian

0

questo perché i compilatori eseguono analisi del codice statico, ad esempio l'analisi delle variabili in tempo reale (analisi all'indietro). Calcola per ogni punto del programma se la variabile verrà letta prima della prossima scrittura.

Problemi correlati