Шрифт:
Ниже приведен пример программы, демонстрирующий применение многоступенчатой конструкции if-else-if. // Демонстрация многоступенчатой конструкции if-else-if. class Ladder { public static void main(String args[]) { int x; for(x=0; x<6; x++) { if(x==l) System.out.println("x is one"); else if(x==2) System.out.println("x is two"); else if(x==3) System.out.println("x is three"); else if(x==4) System.out.println("x is four"); else // Условие, выполняемое по умолчанию. System.out.println("х is not between 1 and 4й); } } }
Выполнение этой программы дает следующий результат: х is not between 1 and 4 x is one x is two x is three x is four x is not between 1 and 4
Как видите, устанавливаемый по умолчанию условный оператор else выполняется лишь в том случае, если проверки по условию всех предыдущих операторов if дают ложный результат. Оператор switch
Вторым оператором выбора в Java является оператор switch, который обеспечивает многонаправленное ветвление программы. Следовательно, этот оператор позволяет сделать выбор среди нескольких альтернативных вариантов дальнейшего выполнения программы. Несмотря на то что многонаправленная проверка может быть организована с помощью последовательного ряда вложенных условных операторов if, во многих случаях более эффективным оказывается применение оператора switch. Этот оператор действует следующим образом. Значение выражения последовательно сравнивается с константами выбора из заданного списка. Как только будет обнаружено совпадение с одним из условий выбора, выполняется последовательность операторов, связанных с этим условием. Ниже приведена общая форма оператора switch. switch(выражение) { case константа1: последовательность операторов break; case константа2: последовательность операторов break; case константаЗ: последовательность операторов break; default: последовательность операторов }
В версиях Java, предшествующих JDK 7, выражение, управляющее оператором switch, должно быть типа byte, short, int, char или перечислением. (Подробнее о перечислениях речь пойдет в главе 12.)
Начиная с версии JDK 7, выражение может относиться к типу String. Это означает, что в современных версиях Java для управления оператором switch можно пользоваться символьной строкой. (Этот прием программирования демонстрируется в главе 5 при рассмотрении класса String.) Но зачастую в качестве выражения, управляющего оператором switch, вместо сложного выражения употребляется простая переменная.
Последовательность операторов из ветви default выполняется в том случае, если ни одна из констант выбора не совпадает с заданным выражением. Ветвь default не является обязательной. Если же она отсутствует и выражение не совпадает ни с одним из условий выбора, то никаких действий вообще не выполняется. Если же происходит совпадение с одним из условий выбора, то выполняются операторы, связанные с этим условием, вплоть до оператора break.
Ниже приведен пример программы, демонстрирующий применение оператора 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; }