Java: руководство для начинающих
Шрифт:
В версиях Java, предшествующих JDK 7, выражение, управляющее оператором switch, должно быть типа byte, short, int, char или перечислением. (Подробнее о перечислениях речь пойдет в главе 12.)
Начиная с версии JDK 7, выражение может относиться к типу String. Это означает, что в современных версиях Java для управления оператором switch можно пользоваться символьной строкой. (Этот прием программирования демонстрируется в главе 5 при рассмотрении класса String.) Но зачастую в качестве выражения, управляющего оператором switch, вместо сложного выражения употребляется простая переменная.
Последовательность операторов из ветви default
Ниже приведен пример программы, демонстрирующий применение оператора switch. // Демонстрация оператора switch, class SwitchDemo { public static void main(String args[]) { int i; for(i=0; i<10; i++) switch (i) { case 0: System.out.println ("i is zero"); break; case 1: System.out.println("i is one"); break; case 2: System.out.println("i is two"); break; case 3: System.out.println("i is three"); break; case 4 : System.out.println("i is four"); break; default: System.out.println("i is five or more"); } } }
Результат выполнения данной программы выглядит следующим образом: i is zero i is one i is two i is three i is four i is five or more i is five or more i is five or more i is five or more i is five or more
Как видите, на каждом шаге цикла выполняются операторы, связанные с совпадающей константой выбора в одной из ветвей case, в обход всех остальных ветвей. Когда же значение переменной i становится равным или больше пяти, оно не совпадает ни с одной из констант выбора, и поэтому управление получает выражение, следующее за оператором default.
Формально оператор break может отсутствовать, но, как правило, в реальных приложениях он применяется. При выполнении оператора break оператор switch завершает работу и управление передается следующему за ним оператору. Если же в последовательности операторов, связанных с совпадающей константой выбора в одной из ветвей case, не содержится оператор break, то сначала выполняются все операторы в этой ветви, а затем операторы, совпадающие с константой выбора в следующей ветви case. Этот процесс продолжается до тех пор, пока не встретится оператор break или же будет достигнут конец оператора switch.
В качестве упражнения проанализируйте исходный код приведенной ниже програм¬ мы. Сможете ли вы предсказать, как будет выглядеть результат ее выполнения? // Демонстрация оператора switch без оператора break, class NoBreak { > public static void main(String args[]) { int i; for(i=0; i<=5; i++) { switch(i) { case 0: // Далее следует "провал" в ветвях case оператора switch. System.out.println("i is less than one"); case 1: System.out.println("i is less than two"); case 2: System, out .println ("i is less than three")-; case 3: System.out.println("i is less than four"); case 4: System.out.println("i is less than five"); } System.out.println; } } }
Выполнение этой программы дает следующий результат: i is less than one i is less than two i is less than three i is less than four i is less than five i is less than two i is less than three i is less than five i is less than three i is less than four i is less than five i is less than four i is less than five i is less than five
Как демонстрирует приведенный выше пример, выполнение программы будет продолжено в следующей ветви case в отсутствие оператора break. А в следующем примере кода показано, что в операторе switch могут присутствовать пустые ветви case: switch(i) { case 1: case 2: case 3: System.out.println("i is 1, 2 or 3"); break; case 4: System.out.println("i is 4"); break; }
Если в приведенном выше фрагменте кода переменная i имеет значение 1, 2 или 3, то вызывается первый метод println . А если ее значение равно 4, вызывается второй метод println . Такое расположение нескольких пустых ветвей case подряд нередко используется в тех случаях, когда нескольким ветвям должен соответствовать один и тот же общий код. Вложенные операторы switch
Один оператор switch может быть частью последовательности операторов другого, внешнего оператора switch. И такой оператор switch называется вложенным. Константы выбора внутреннего и внешнего операторов switch могут содержать общие значения, не вызывая никаких конфликтов. Например, следующий фрагмент кода является вполне допустимым: switch(chi) { case 'A1: System.out.println("This A is part of outer switch."); switch(ch2) { case 'A1: System.out.println("This A is part of inner switch"); break; case 'B' : // ... } // конец внутреннего оператора switch break; case 'B': // ...
Пример для опробования 3.1. Начало построения справочной системы Java
В этом проекте предстоит создать простую справочную систему, предоставляющую сведения о синтаксисе управляющих операторов Java. Программа, реализующая эту справочную систему, отображает меню с названиями операторов и ожидает выбора одного из них. Как только пользователь выберет один из пунктов меню, на экран будут выведены сведения о синтаксисе соответствующего оператора. В первой версии данной программы предоставляются сведения только об операторах if и switch. Ав последующих проектах будут добавлены справочные данные об остальных управляющих операторах.
Последовательность действий
Создайте новый файл Help.java.
В начале работы программы отображается следующее меню:Help on: 1. if 2. switch Choose one: Для этой цели потребуется приведенная ниже последовательность операторов.System.out.println("Help on:"); System.out.println(" 1. if"); System.out.println(" 2. switch"); System.out.print("Choose one: ");
Далее программа получает данные о выборе пользователя. С этой целью вызывается метод System.in.read, как показано ниже.choice = (char) System.in.read;
После этого в программе используется оператор switch для отображения сведений о синтаксисе выбранного оператора.switch(choice) { case 111: System.out.println("The if:\n"); System.out.println("if(condition) statement;"); System.out.println("else statement;"); break; case 12’ : System.out.println("The switch:\n"); System.out.println("switch(expression) {"); System.out.println(" case constant:"); System.out.println(" statement sequence"); System.out.println(" break;"); System.out.println (" // ..."); System.out.println("}"); break; default: System.out.print("Selection not found."); } Обратите внимание на то, как в ветви default перехватываются сведения о неправильно сделанном выборе. Так, если пользователь введет значение 3, оно не совпадет ни с одной из констант в ветвях case оператора switch, и тогда управление будет передано коду в ветви default.