Почему эта константа Float равна нулю при выполнении статического блока?

Следующий код при выполнении печатает nitesh null вместо ожидаемого nitesh 130. Почему не инициализируется n перед выполнением статического блока?

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)
      {
      }
}

Ответы

Ответ 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).
  • ...
  • Затем выполните либо инициализаторы переменной класса, либо статические инициализаторы класса, или инициализаторы поля интерфейса, в текстовом порядке, как если бы они были одним блоком.