Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
49
Добавлен:
12.05.2015
Размер:
1.82 Mб
Скачать

Глава 5. Управляющие операторы 113

i меньше 10

i меньше 10

i меньше 10

i равно 10 или больше

i равно 10 или больше

Можно видеть, что выполнение проходит через каждый case, пока не встре­чается оператор break (или не будет достигнут конец оператора switch).

Хотя предшествующий пример придуман, конечно, ради иллюстрации, про­пуск оператора break имеет много практических приложений в реальных программах. Чтобы показать более жизненное использование switch, рас­смотрим следующий вариант примера с временами года, приведенного ра­нее. Эта версия использует switch, чтобы обеспечить более эффективную реализацию.

// Улучшенная версия программы с временами года, class Switch {

public static void main(String args[]) { int month = 4; String season; switch (month) { case 12: case 1: case 2:

season = "Зима"; break/­case 3: case 4: case 5:

season = "Весна"; break; case 6: case 7 : case 8:

season = "Лето"; break; case 9: case 10: case 11:

season = "Осень"; break/­default:

season = "Непонятный месяц"; }

System.out.println("Апрель это " + season + "."); } }

114 Часть I. Язык Java

Вложенные siv/fc/т-операторы

Вы можете использовать switch как часть последовательности операторов некоторого внешнего switch. Это называется вложенным switch. Так как switch-оператор определяет свой собственный блок, никакие конфликты между case-метками во внутреннем и внешнем switch не возникают. На­пример, следующий фрагмент совершенно законен:

switch(count) { case 1:

switch(target) { // вложенный switch

case 0:

System.out.println("target равен нулю"); break;

case 1: // нет конфликтов с внешним switch

System.out.print In("target равен единице"); break; }

break; case 2: //.. .

Здесь утверждение с меткой case 1 во внутреннем switch не находится в противоречии с утверждением case i во внешнем switch. Переменная count сравнивается только с case-меткой на внешнем уровне. Если count равна 1, то переменная target сравнивается с внутренней case-меткой. Обратите внимание на три важные особенности оператора switch.

П switch отличается от if тем, что может проверять только равенство (своей переменной с case-метками), тогда как if может оценивать любой тип булевского выражения. То есть, switch отыскивает только соответст­вие между значением выражения и одной из его case-меток.

П Никакие две case-метки внутри switch не могут иметь идентичных зна­чений. Однако операторы switch, включенные во внешний switch, могут, конечно, иметь общие case-метки с внутренним switch.

О Оператор switch обычно более эффективен, чем набор вложенных if.

Последний пункт особенно интересен, потому что он дает возможность по­нять, как работает компилятор Java. Когда компилируется оператор switch, компилятор Java просматривает каждую из case-констант и создает "таблицу переходов", которая будет использоваться для выбора пути выполнения в зависимости от значения выражения. Поэтому, если нужно выбирать среди большой группы значений, оператор switch, выполнится намного быстрее, чем эквивалентная кодированная логика, использующая последовательности if-eise. Компилятор может делать это, т. к. он знает, что все case-константы имеют один и тот же тип и просто должны быть проверены на

Соседние файлы в папке JavaLit