Почему при использовании switch в Java, при совпадении с первым case, выводятся все case-ы
package com.company;
public class Main {
public static void main(String[] args) {
int monthNumber = 3;
switch (monthNumber) {
case 1:
System.out.println("January");
case 2:
System.out.println("Feb");
case 3:
System.out.println("March");
}
}
}
попробуйте заменить номер переменной на 1, затем на 2, затем на 3. Посмотрите на разницу вывода
Ответы (2 шт):
В каждом блоке case можно использовать оператор break, чтобы прерывать выполнение кода в текущем блоке case. Оператор break не является обязательным, если его нет в блоке case – происходит "провал" (передаётся управление) в следующий блок case и происходит выполнение кода в этом блоке. Такие "провалы" происходят пока не встретится оператор break или до конца оператора switch. Если же оператор break присутствует - выполнение передаётся за пределы оператора switch (выход из switch)
public static void main(String[] args) {
int monthNumber = 3;
switch (monthNumber) {
case 1:
System.out.println("January");
break;
case 2:
System.out.println("Feb");
break;
case 3:
System.out.println("March");
break;
}
}
Потому, что вы не используете команду для явного выхода из блока. Например break, return, throw, exit, goto. Последняя команда, больше похожа на реализацию самого оператора switch, в котором после вычисления выражения в скобках происходит переход на метку, которая имеет название case со значением. Метка не может передать управление при выходе из case-а, она лишь указывает на строку. Поэтому в блоке switch утверждение case и default - это просто метки, и после перехода на соответствующую метку оставшаяся часть кода в блоке выполняется независимо от того какой case-значение стоит.
Более подробно про switch можно почитать в Java Tutorial.
Тело оператора switch известно как блок переключения. Оператор в блоке switch может быть помечен одним или несколькими регистрами или метками по умолчанию. Оператор switch оценивает свое выражение, затем выполняет все операторы, следующие за соответствующей меткой case.
Вы также можете отображать название месяца с помощью операторов if-then-else:
int month = 8; if (month == 1) {System.out.println ("Январь"); } else if (month == 2) {System.out.println ("Февраль"); } //... и так далеРешение о том, использовать ли операторы if-then-else или оператор switch, основывается на удобочитаемости и выражении, которое проверяется оператором. Оператор if-then-else может проверять выражения на основе диапазонов значений или условий, тогда как оператор switch проверяет выражения только на основе одного целого числа, перечислимого значения или объекта String.
Еще один интересный момент - это оператор break. Каждый оператор break завершает включающий оператор switch. Поток управления продолжается с первого оператора, следующего за блоком switch. Операторы break необходимы, потому что без них операторы в блоках switch не справляются: все операторы после соответствующей метки case выполняются последовательно, независимо от выражения последующих меток case, до тех пор, пока не встретится оператор break.