2012-03-12 12 views
10

Ho difficoltà a capire l'ordine in cui avviene l'inizializzazione. questo è l'ordine che ho pensato:In che ordine vengono eseguiti il ​​blocco inizializzatore e le definizioni delle variabili e così via? (in Java)

*Once per 
    1. Static variable declaration 
    2. Static block 
*Once per object 
    3. variable declaration 
    4. initialization block 
    5. constructor 

ma secondo questo codice Sono ovviamente sbagliato:

class SomethingWrongWithMe 
    { 
     { 
      b=0;   //no. no error here. 
      int a = b; //Error: Cannot reference a field before it is defined. 
     } 
     int b = 0; 
    } 

E l'errore scomparirebbe se faccio questo:

class SomethingWrongWithMe 
    { 
     int b = 0; 
     { 
      b=0; 
      int a = b; //The error is gone. 
     } 
    } 

posso capisco perché non c'è un errore su

b=0; 
+0

Che compilatore stai utilizzando? Oracles javac? O qualche IDE (almeno Eclipse porta il proprio compilatore) –

+0

Eclipse e Oracles javac si comporta allo stesso modo in questo scenario. – aioobe

+1

utilizzando eclissi .. – Untitled

risposta

4

Il Java Language Specification (sezione 8.3.2.3) dice che si può utilizzare una variabile a sinistra lato di mano di un'espressione, cioè assegnarlo ad esso, prima che sia dichiarato, ma non è possibile utilizzarlo sul lato destro.

Tutte le variabili sono inizializzate sui valori predefiniti, quindi inizializzatori espliciti e blocchi anonimi vengono eseguiti nell'ordine in cui sono stati trovati nel file di origine. Alla fine viene chiamato il costruttore.

Le statistiche vengono eseguite una sola volta al primo utilizzo di una classe.

L'errore di compilazione sembra essere una regola di Java piuttosto che qualcosa che ha necessariamente senso in ogni caso.

+0

domanda successiva: ok. Ora capisco la situazione qui. proprio non riesco a capire perché c'è una tale caratteristica. Non riesco a immaginare un uso per questo.perché qualcuno dovrebbe voler assegnare una variabile nel blocco di inizializzazione prima della sua dichiarazione? perché non dichiararlo solo per primo? – Untitled

+1

Sono d'accordo, e perché possiamo assegnargli un valore, ma non leggerlo? Il JLS dice che tutte le variabili sono create e inizializzate su valori predefiniti prima che venga eseguito qualsiasi codice esplicito, quindi la variabile esiste e ha un valore, non possiamo leggerne. Mi sembra strano. –

+0

È fatto per evitare riferimenti circolari. Per esempio. int a = b + 1; int b = a + 2; – ekaerovets

1

Prima di tutto, le ipotesi sono più o meno corrette, tranne per il fatto che le dichiarazioni (con inizializzazione, come int b = 0) e i blocchi di inizializzazione dell'istanza vengono eseguite nell'ordine in cui sono scritte.

int b = 0; // executed first 

{ 
    b = 1; // executed second 
} 

int a = b; // executed third 

noti inoltre che dichiarazione cioè int b non viene eseguito. La dichiarazione solo dichiara l'esistenza della variabile.

Per quanto riguarda l'errore ottenuto (o, piuttosto, l'errore si non ha ottenuto) Sono d'accordo che sembra strano. Suppongo che il compilatore si occupi di referenziare una variabile in un'espressione e assegnargli un valore in modi diversi. Quando si scrive su una variabile in un inizializzatore di istanza, controlla solo che la variabile sia presente, mentre durante la lettura da esso, richiede che sia dichiarata sopra il blocco di inizializzazione dell'istanza. Vedrò se riesco a trovare un riferimento per questo nel JLS.

3

Le definizioni di variabile non vengono eseguite "prima" dei blocchi. Sono entrambi fatti allo stesso tempo, nell'ordine in cui sono definiti

class SomethingWrongWithMe { 
    { 
     b = debug("block 1"); 
    } 
    int b = debug("define"); 
    { 
     b = debug("block 2"); 
    } 
    private int debug(String str) { 
     System.out.println(str); 
     return 0; 
    } 
} 

uscita

block 1 
define 
block 2 
+1

Giusto, ma la domanda per cui può scrivere su una variabile dichiarata sotto la riga ma non letta dalla stessa variabile non riceve risposta. – aioobe

Problemi correlati