Неожиданный вывод при использовании троичного оператора и конечной переменной - PullRequest
12 голосов
/ 17 января 2011

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

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 меняет поведение для второго вывода.

1 Ответ

9 голосов
/ 17 января 2011

Во втором случае z2 считается как константное выражение , потому что это конечная переменная типа int.

С раздел 4.12.4 :

Мы называем переменную примитивного типа или типа String, которая является конечной и инициализируется константным выражением времени компиляции (§15.28) постоянной переменной. Независимо от того, является ли переменная постоянной или нет, это может иметь последствия в отношении инициализации класса (§12.4.1), двоичной совместимости (§13.1, §13.4.9) и определенного присваивания (§16).

Раздел 15.28 включает «постоянные переменные» в набор элементов, которые можно использовать для формирования постоянного выражения.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...