конечная переменная (даже если ничто иное не присваивает ей значение), поэтому она не является константной переменной и, следовательно, не является константным выражением - поэтому параграф, указанный в спецификации, не применяется.

отрим этот фрагмент кода:

public static void main(String[] args) {
    int z1 = 0;
    final int z2 = 0;
    System.out.println(false ? z1 : 'X');
    System.out.println(false ? z2 : 'X');
}

При запуске этого кода я бы ожидал увидеть дваX в вашей консоли. Тем не менее, реальный результат:

88
X

Если мы посмотрим наСпецификации Java относительно троичного оператора, мы нашли это

Если один из операндов имеет тип T, где T является байтом, коротким или char, а другой операнд является константным выражением типа int, значение которого представимо в типе T, тогда тип условного выражения - T.

Таким образом, первый вывод учитывает'X' символ какintпоэтому печатает88.

Тем не менее, я не уверен, чтобы понять, почему использованиеfinal изменяет поведение для второго выхода.