switch语句是 Java 语言中可用的五个控制流语句之一。它允许任意数量的执行路径。语句将switch选择器变量作为参数,并使用该变量的值来选择将要执行的路径。
您必须在以下类型中选择选择器变量的类型:
- byte, short, char, 和int原始数据类型
- Character, Byte, Short, 和Integer包装类型
- 枚举类型
- String类型。
值得注意的是,以下原始类型不能用于选择器变量的类型:boolean、long、float和double。
让我们看一个switch语句的第一个例子。
int quarter = ...; // any value String quarterLabel = null; switch (quarter) { case 0: quarterLabel = "Q1 - Winter"; break; case 1: quarterLabel = "Q2 - Spring"; break; case 2: quarterLabel = "Q3 - Summer"; break; case 3: quarterLabel = "Q3 - Summer"; break; default: quarterLabel = "Unknown quarter"; };
语句的主体switch称为switch块。块中的语句switch可以用一个或多个case或default标签来标记。该switch语句计算其表达式,然后执行匹配case标签后面的所有语句。
您可能已经注意到break关键字的使用。每个break语句都终止封闭switch语句。switch控制流从块后面的第一条语句继续。这些break语句是必要的,因为没有它们,switch块中的语句就会失败。匹配case标签之后的所有语句都按顺序执行,无论后续case标签的表达式如何,直到break遇到一条语句。
以下代码使用 fall through 填充futureMonths列表。
int month = 8; List<String> futureMonths = new ArrayList<>(); switch (month) { case 1: futureMonths.add("January"); case 2: futureMonths.add("February"); case 3: futureMonths.add("March"); case 4: futureMonths.add("April"); case 5: futureMonths.add("May"); case 6: futureMonths.add("June"); case 7: futureMonths.add("July"); case 8: futureMonths.add("August"); case 9: futureMonths.add("September"); case 10: futureMonths.add("October"); case 11: futureMonths.add("November"); case 12: futureMonths.add("December"); break; default: break; }
从技术上讲,finalbreak不是必需的,因为 flow 不在switch语句中。建议使用 abreak以便修改代码更容易且不易出错。
该default部分处理其中一个部分未明确处理的所有值case。
以下代码示例显示了一条语句如何具有多个case标签。代码示例计算特定月份的天数:
int month = 2; int year = 2021; int numDays = 0; switch (month) { case 1: case 3: case 5: // January March May case 7: case 8: case 10: // July August October case 12: numDays = 31; break; case 4: case 6: // April June case 9: case 11: // September November numDays = 30; break; case 2: // February if (((year % 4 == 0) && !(year % 100 == 0)) || (year % 400 == 0)) numDays = 29; else numDays = 28; break; default: System.out.println("Invalid month."); break; }
这段代码有一个多于一个的语句case。