2014-06-13 15 views
18

Poniższy kod, po wykonaniu, wyświetla nitesh null zamiast oczekiwanego nitesh 130. Dlaczego nie jest inicjowane n przed wykonaniem bloku statycznego?Dlaczego ta stała zmiennoprzecinkowa jest pusta przy wykonywaniu bloku statycznego?

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

[ 'To pytanie powinno być zamknięte, ponieważ jest to odbierane przez JonSkeet'] (http://meta.stackexchange.com/a/13300/256679) –

Odpowiedz

25

str jest stałą czasu kompilacji - n nie jest, bo to od rodzaju Float. Jeśli zmienisz go na final static float n = 130f, zobaczysz wartość w bloku inicjalizacji statycznej.

Więc obecnie w statycznym bloku inicjatora wartość str jest rzeczywiście inlined - kod jest równoważny:

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

Od JLS section 15.28 (constant expressions):

Stała ekspresja jest wyrazem oznacza wartość typu pierwotnego lub ciąg, który nie kończy się nagle i składa się wyłącznie z następujących elementów: [...]

Float nie jest typem pierwotnym.

Dodatkowo, nawet bez wstawiania, zmienna stała str jest inicjowana przed wykonaniem dowolnego statycznego bloku inicjalizatora. Od section 12.4.2 of the JLS (szczegóły inicjalizacji klasy):

  • ...
  • Następnie zainicjować statycznych pól C, które są zmienne ciągłe (§4.12.4, §8.3.2, §9.3.1) .
  • ...
  • Następnie należy uruchomić inicjatory klas i inicjatory statyczne klasy lub inicjatory pól interfejsu, w kolejności tekstowej, tak jakby były pojedynczym blokiem.
+0

@Task: Nie, to w żaden sposób krótsza wersja tego, co powiedziałem. Wszystko zależy od tego, które zmienne są rzeczywiście stałymi w czasie kompilacji, a ich wartości są wstawiane wszędzie tam, gdzie są używane. –

+0

Oppss !! Zgadzam się. Aby spędzać więcej czasu z JavaDoc. _Dziękuję za wyjaśnienia._ (_Bo sposób +10 za twoją odpowiedź_) –

+0

Ale Float jest typem pierwotnym http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html – Arijit