2014-06-13 7 views
18

Il seguente codice, una volta eseguito, stampa nitesh null anziché nitesh 130. Perché non è stato inizializzato n prima di eseguire il blocco statico?Perché questa costante Float è nullo quando si esegue il blocco statico?

class test 
{ 
     static 
     { 
      System.out.println(test.str+" "+test.n); 
     } 
     final static String str="nitesh"; 
     final static Float n=130f; 
     public static void main(String []args) 
     { 
     } 
} 
+8

[ 'Questa domanda dovrebbe essere chiuso perché è risposto da JonSkeet'] (http://meta.stackexchange.com/a/13300/256679) –

risposta

25

str è una costante fase di compilazione - n non è, perché è di tipo Float. Se lo cambi in final static float n = 130f, vedrai il valore nel blocco di inizializzazione statico.

Così attualmente, nel blocco di inizializzazione statica, il valore di str viene effettivamente inline - il codice è equivalente a:

System.out.println("nitesh "+test.n); 

Da JLS section 15.28 (constant expressions):

Un'espressione costante è un'espressione denotando un valore di tipo primitivo o una stringa che non si completa bruscamente e viene composta utilizzando solo quanto segue: [...]

Float non è un tipo primitivo.

Inoltre, anche senza la funzione di allineamento, la variabile costante str viene inizializzata prima dell'esecuzione di uno qualsiasi dei blocchi di inizializzazione statici. Da section 12.4.2 of the JLS (dettagli inizializzazione classe):

  • ...
  • Poi, inizializzare i campi statici di C che sono variabili costanti (§4.12.4, §8.3.2, §9.3.1) .
  • ...
  • Successivamente, eseguire gli inizializzatori di variabile di classe e gli inizializzatori statici della classe o gli inizializzatori di campo dell'interfaccia, in ordine testuale, come se fossero un blocco singolo.
+0

@task: No, questo è in alcun modo una versione più breve di quello che ho detto. Tutto ha a che fare con le variabili che sono in realtà costanti in fase di compilazione, i cui valori sono allineati ovunque vengano utilizzati. –

+0

Oppss !! Accetto. Occorre passare più tempo con JavaDoc. _Grazie per il chiarimento._ (_Per il modo +10 per la tua risposta_) –

+0

Ma Float è un tipo primitivo http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html – Arijit

Problemi correlati