Ещё одним вариантом условного ветвления программы является ветвление с помощью оператора switch..case.
Его синтаксис следующий
switch (проверяемое выражение)
{
case значение 1:
код для исполнения если значение 1 совпадает со значением проверяемого выражения;
break;
case значение 2:
код для исполнения если значение 2 совпадает со значением проверяемого выражения;
break;
...
case значение n:
код для исполнения если значение n совпадает со значением проверяемого выражения;
break;
default:
код для исполнения если ни одно из значений не совпадает со значением проверяемого выражения;
break;
}
Работает вся эта конструкция следующим образом.
Пишем ключевое слово switch. Затем в круглых скобках указываем либо проверяемую переменную, либо проверяемое выражение.
Далее в фигурных скобках пишем ключевое слово case, после которого указываем точное значение.
При совпадении значение проверяемой переменной (или проверяемого выражения) со значением, указанным после слова case, выполнится код, который расположен после двоеточия.
Если значения не совпадут, то код после двоеточия не выполнится, и программа перейдёт к сравнению проверяемой переменной (или выражения) со следующим значением, указанным после следующего case.
Если ни одно значение, указанное после всех case не совпадёт со значением проверяемой переменной (или выражения), то выполнится код, указанный после ключевого слова default.
Самый наглядный пример, наверное с месяцами.
int num_mes = 2;
switch ( num_mes )
{
case 1:
System.out.println("Сейчас январь!");
break;
case 2:
System.out.println("Сейчас февраль!");
break;
case 3:
System.out.println("Сейчас март!");
break;
...
case 12:
System.out.println("Сейчас декабрь!");
break;
default:
System.out.println("Неверно указан номер месяца!");
break;
}
Итак, как работает этот код?
Объявляем переменную, которая будет хранить номер месяца, и присваиваем ей начальное значение. В нашем примере - число 2.
Далее в качестве проверяемой переменной указываем нами объявленную num_mes.
Теперь начинаем проверять возможные значения этой переменной.
case 1:
Если бы значение переменной num_mes было бы равно 1, то выполнился бы код после двоеточия:
System.out.println("Сейчас январь!");
На экран бы был выведен текст "Сейчас январь!".
В нашем примере num_mes не равно 1, значит, код после двоеточия не выполнится, идём дальше
case 2:
Ага, здесь значение проверяемой переменной num_mes совпадает с числом, указанным после case, соответственно, выполнится код, указанный после двоеточия
System.out.println("Сейчас февраль!");
Всё, теперь сработает ключевое слово break и оператор switch case завершит свою работу, далее программа продолжит выполняться, будет исполняться код, указанный после закрывающихся фигурных скобок }
Если номер месяца указать не в интервале 1...12, выполнится код по умолчанию, указанный после ключевого слова default:
Итак, какие есть особенности.
1. В качестве проверяемого может быть переменная, либо выражение
Например.
int a = 1;
int b = 2;
Можно проверить переменную
switch (a)
{
...
}
А можно проверить выражение
switch (a + b)
{
...
}
2. Проверяемая переменная или выражение могут быть только следующих типов (известных нам на данный момент):
byte, short, char, int, String
Если указать данные другого типа, компилятор выдаст ошибку.
Соответственно и сравнивать их нужно с данными того же типа (указывать после каждого case).
Есть и другие возможные типы данных, но мы их пока не изучили, поэтому указывать их в текущем уроке я не буду.
3. Проверяемые данные (которые указываются после всех case) должны быть либо конкретными значениями, либо константами.
Вот так:
int a = 1;
int b = 2;
switch (a)
{
case b:
}
делать нельзя.
Только если b - константа, а не переменная.
4. Нельзя использовать несколько одинаковых проверяемых данных (после case). Такой код не скомпилируется. Например,
int a = 1;
int b = 2;
switch (a + b)
{
case 1:
System.out.println("a + b = " + a + b);
break;
case 1:
System.out.println("a + b = " + a + b);
break;
case 2:
System.out.println("a + b = " + a + b);
break;
}
5. default может быть размещено в любом месте внутри фигурных скобок, не обязательно в конце.
6. default не является обязательным. Если написать несколько case и не писать default, то при несовпадении проверяемой переменной (или выражения) ни с одним значением, указанным после всех case, то в результате исполнения switch case ничего не выполнится и программа продолжит исполнение дальнейшего кода. Иногда default не указывается намеренно - в зависимости от поставленной задачи.
7. Ключевое слово break также не является обязательным. НО. Если его не будет, то при совпадении значения проверяемого выражения с первым совпавшим значением после case программа начнёт исполнять весь дальнейший код, независимо от совпадения с дальнейшими значениями после следующих case. Пример для понимания, о чём идёт речь.
int a = 1;
switch (a)
{
case 0:
System.out.println("ноль ");
case 1:
System.out.println("один ");
case 2:
System.out.println("два ");
case 3:
System.out.println("три ");
}
В этом примере мы не писали break. При первом совпадении, а это значение 1, будет исполняться весь код, указанный после case 1:
То есть результатом исполнения этого кода будет вывод на экран
"один два три "
вне зависимости от того, что значение переменной a не равно ни 2 и ни 3.
При этом можно указывать break необязательно после каждого case. Если добавить в наш код после
case 2:
System.out.println("два ");
ключевое слово
break;
то текст, выведенный на экран будет следующим:
"один два "
Соответственно, как только код программы доходит до break, исполнение оператора switch case прекращается.
8. Если у нас для нескольких значений проверяемой переменной должен быть одинаковый код для исполнения, то case и значения можно перечислить в следующем порядке
case значение 1: case значение 2: значение 3:
код для исполнения
break;
case значение 4: case значение 5: значение 6:
код для исполнения
break;
На классическом примере с временами года
String mes = "Май";
switch ( mes )
{
case "Январь": case "Февраль": case "Декабрь":
System.out.println("Сейчас зима");
case "Март": case "Апрель": case "Май":
System.out.println("Сейчас весна");
case "Июнь": case "Июль": case "Август":
System.out.println("Сейчас лето");
case "Сентябрь": case "Октябрь": case "Ноябрь":
System.out.println("Сейчас осень");
}
Здесь если значение переменной mes будет равно "Январь", "Февраль" или "Декабрь", то должен выполниться один и тот же код
System.out.println("Сейчас зима");
Для остальных времен года аналогично. Как раз для таких случаев использование такой формы кода целесообразно.
Ну и традиционная задача.
Условие задачи. Присваиваем переменной наименование цвета. Программа должна определить, относится ли этот цвет к цветам радуги и вывести соответствующее сообщение.
Создаём новый класс с именем Raduga и объявляем главный метод main
class Raduga
{
public static void main (String[] args)
{
}
}
Объявляем переменную с наименованием цвета. Переменная строкового типа
String color = "Оранжевый";
Далее создаём оператор
switch ( color )
{
}
Внутри фигурных скобок указываем 2 варианта развития событий - один для варианта, когда цвет соответствует цвету радуги, другой - для варианта когда не соответствует.
case "Красный": case "Оранжевый": case "Желтый": case "Зеленый": case "Голубой": case "Синий": case "Фиолетовый":
System.out.println("Цвет " + color + " является одним из цветов радуги");
Не забываем писать
break;
Другие варианты мы объединим в вариант по умолчанию
default:
System.out.println("Цвет не является одним из цветов радуги или неверно указано наименование цвета");
break;
Поскольку вариант по умолчанию идёт в самом конце, ключевое слово break можно было не указывать. Но мы для того, чтобы оно отложилось в голове, всё-таки укажем.
Всё, сохраняем
Компилируем и запускаем
Попробуйте самостоятельно изменить переменную color, присвоить ей другое значение и проверьте, каким будет результат выполнения программы.
Выводы:
- Один из вариантов условного ветвления программы является оператор switch..case;
- В качестве проверяемых данных может быть переменная либо сложное (или не очень) выражение;
- Проверяемая переменная или выражение могут быть только следующих типов (известных нам на данный момент): byte, short, char, int, String
- Данные, которые указываются после всех case, должны быть либо конкретными значениями, либо константами. Они не могут быть переменными.
- Нельзя использовать несколько одинаковых проверяемых данных (после case).
- Блок default не является обязательным. Блок default может быть размещён в любом месте внутри фигурных скобок, необязательно в конце.
- Ключевое слово break не является обязательным, но если его не использовать, то нужно учитывать особенности работы оператора switch..case для такого варианта.
Ссылка на предыдущий урок
Ссылка на следующий урок
Ссылка на содержание курса