В спецификации языка Java мы идем. case
маркирует switch
Заявления в определяются как
SwitchLabel:
case ConstantExpression :
case EnumConstantName :
default :
Вашего num
переменный не относятся к enum
постоянному имени, так что давайте игнорировать это. Что такое ConstantExpressions
? ПСБ снова определяет его
время компиляции константа является выражением, обозначающим значение примитивного типа или String
, который не завершить внезапно и является состоит, используя только следующее:
- литералы примитивного типа и литералы типа String,
- [...]
- Простые имена (§6.5.6.1), которые относятся к постоянных переменных (§ 4. 12,4).
Так примитивный int
значение 2
является постоянным выражением. Вы могли бы сделать
switch {
case 2:
}
Теперь мы хотим знать связь с использованием final
и постоянной переменной.
A пустойfinal
является final
переменными, декларация не имеет инициализатор. [...]
Переменные примитивного типа или типа String
, то есть final
и инициализирован с постоянным выражением во время компиляции (§15.28), является называется постоянной переменной.
Так что последняя цитата имеет в виду не- пустойfinal
переменной, то есть. тот, у которого есть инициализатор.
Так
final int num1 = 1;
является постоянной величиной.
И
final int num2;
num2 = 2;
не является и, следовательно, не может быть использован в case
этикетке.
Можете ли вы показать нам, как вы используете это, чтобы получить сообщение об ошибке? Пока вы объявляете и инициализируете num2 перед его включением, проблем не должно быть. – user1205577
Ответы здесь и обсуждение в комментариях могут помочь: http://stackoverflow.com/questions/16255270/final-variable-case-in-switch-statement Также обозначение это как дубликат. –
Да, [это] (http://stackoverflow.com/a/16255341/2358786) - ответ. num1 - константа времени компиляции, а num2 - нет. – kiruwka