Ответ 1
Во втором случае z2
считается константным выражением, потому что это конечная переменная типа int
.
Из раздел 4.12.4:
Мы вызываем переменную примитивного типа или типа String, которая является окончательной и инициализируется постоянным выражением времени компиляции (§15.28) постоянной переменной. Независимо от того, является ли переменная постоянной или нет, она может иметь последствия для инициализации класса (§12.4.1), бинарной совместимости (§13.1, §13.4.9) и определенного назначения (§16).
Раздел 15.28 включает в себя "постоянные переменные" в наборе элементов, которые могут использоваться для формирования постоянного выражения.
z1
не является конечной переменной (хотя ничто не присваивает ему значение), поэтому она не является постоянной переменной и, следовательно, не является постоянным выражением, поэтому абзац, который вы цитируете из спецификации, не применяется.