2014-03-29 17 views
8

Простите за мое невежество. Я не мог понять разницу между следующими, казалось бы, похожими строками кода.В чем разница между двумя строками кода Java?

  1. final int num1 = 1;
  2. final int num2;num2 = 2;

Что делает num2 не имеют права на включение случая постоянной?

switch (expression) { 
     case num1: 
      System.out.println("Case A"); 
     case num2: 
      System.out.println("Case B"); 
    } 
+1

Можете ли вы показать нам, как вы используете это, чтобы получить сообщение об ошибке? Пока вы объявляете и инициализируете num2 перед его включением, проблем не должно быть. – user1205577

+1

Ответы здесь и обсуждение в комментариях могут помочь: http://stackoverflow.com/questions/16255270/final-variable-case-in-switch-statement Также обозначение это как дубликат. –

+0

Да, [это] (http://stackoverflow.com/a/16255341/2358786) - ответ. num1 - константа времени компиляции, а num2 - нет. – kiruwka

ответ

7

В спецификации языка 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 этикетке.

-2

в num1 вы инициализировать его сразу же, в num2 вы не делаете сразу, вы назначаете его это значение позже

+0

Это ясно, как дневной свет. Но какова точка в num2, которая не может быть постоянной в случае переключения? –

+0

@Phoenix это потому, что операторы компилятора и коммутатора чувствительны к типу, и, завершая его, вы убедитесь, что он не может изменить значение или тип. Например, если вы используете его на jcombobox, вы должны указать, что поле будет окончательным, прежде чем вы сможете запустить оператор switch –

+2

. Я не покупаю это объяснение ... Вопрос в том, что это объяснение не имеет ссылки (на JLS, возможно) – fge

0

Таким образом, чтобы ответить на ваш вопрос: num1 является время компиляции постоянной, поэтому компилятор может существенно заменить его 1:

switch(whatever) { 
    case num1: // will produce same bytecode as 

    case 1: // num1 was replaced by compiler 

} 

Компилятор не может предполагать то же самое о num2, как объяснено простой пример here

Обратите внимание, что вы должны были тем же проблемы с num1, вы инициализирован его непостоянным, например: int num1 = new Random().nextInt();

Смежные вопросы