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