switch语法
switch (key) {
case value:
break;
default:
break;
}
switch语句将从与选项值(上例子为key)匹配的case标签处开始执行直到遇到break语句,或执行到switch语句的结束处为止。如果没有相匹配的case标签,而有default子句,就执行这个子句。
与if和if-else语句不同,switch语句可以有许多可能的执行路径。switch可处理byte、short、char和int基本数据类型。它还适用于枚举类型、String类以及包装某些基本类型的一些特殊类:Character、Byte、Short和Integer。
public class SwitchDemo {
public static void main(String[] args) {
int month = 8;
String monthString;
switch (month) {
case 1: monthString = "January";
break;
case 2: monthString = "February";
break;
case 3: monthString = "March";
break;
case 4: monthString = "April";
break;
case 5: monthString = "May";
break;
case 6: monthString = "June";
break;
case 7: monthString = "July";
break;
case 8: monthString = "August";
break;
case 9: monthString = "September";
break;
case 10: monthString = "October";
break;
case 11: monthString = "November";
break;
case 12: monthString = "December";
break;
default: monthString = "Invalid month";
break;
}
System.out.println(monthString);
}
}
//输出为August
switch语句的主体称为switch块。switch块中的语句可以用一个或多个case标签或默认标签进行标记。switch语句对其表达式求值,然后执行匹配大小写标签后面的所有语句。
决定是否使用if-then-else语句或switch语句是基于可读性和语句所测试的表达式。if-then-else语句可以基于值或条件的范围测试表达式,而switch语句仅基于单个整数、枚举值或字符串对象测试表达式。
另一个有趣的地方是break语句。每个break语句都终止包含的switch语句。控制流继续执行开关块后面的第一个语句。break语句是必要的,因为没有break语句,switch块中的语句就会失效:匹配case标号之后的所有语句都按顺序执行,而不管后续case标号的表达式是什么,直到遇到break语句为止。
public class SwitchDemoFallThrough {
public static void main(String[] args) {
java.util.ArrayList<String> futureMonths =
new java.util.ArrayList<String>();
int month = 8;
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;
}
if (futureMonths.isEmpty()) {
System.out.println("Invalid month number");
} else {
for (String monthName : futureMonths) {
System.out.println(monthName);
}
}
}
}
//此时输出为
August
September
October
November
December
上面就是switch的穿透,因为没有break,它会一条条执行下去,直至遇到break或 default语句
//穿透的一种利用
class SwitchDemo2 {
public static void main(String[] args) {
int month = 2;
int year = 2000;
int numDays = 0;
switch (month) {
case 1: case 3: case 5:
case 7: case 8: case 10:
case 12:
numDays = 31;
break;
case 4: case 6:
case 9: case 11:
numDays = 30;
break;
case 2:
if (((year % 4 == 0) &&
!(year % 100 == 0))
|| (year % 400 == 0))
numDays = 29;
else
numDays = 28;
break;
default:
System.out.println("Invalid month.");
break;
}
System.out.println("Number of Days = "
+ numDays);
}
}
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html