Ответ 1
str
является константой времени компиляции - n
не является, потому что это тип Float
. Если вы измените его на final static float n = 130f
, вы увидите значение в статическом блоке инициализации.
Так что в настоящее время в статическом блоке инициализатора значение str
на самом деле является встроенным - ваш код эквивалентен:
System.out.println("nitesh "+test.n);
Из JLS раздел 15.28 (постоянные выражения):
Постоянное выражение представляет собой выражение, обозначающее значение примитивного типа или String, которое не завершается внезапно и составлено, используя только следующее: [...]
Float
не является примитивным типом.
Кроме того, даже без вставки константная переменная str
инициализируется до того, как будет выполнен любой из статических блоков инициализатора. Из раздела 12.4.2 JLS (сведения о инициализации класса):
- ...
- Затем инициализируйте статические поля C, которые являются постоянными переменными (§4.12.4, §8.3.2, §9.3.1).
- ...
- Затем выполните либо инициализаторы переменной класса, либо статические инициализаторы класса, или инициализаторы поля интерфейса, в текстовом порядке, как если бы они были одним блоком.