switch表达式、case穿透
记得第一次学switch的时候那是还是学习c语言的时候,整体的写if-else,switch,现在回想起来已经是很多年前的事了,好了今天让我们再来回顾下简单的switch
语法
switch(n) { case 1: 执行代码块 1 break; case 2: 执行代码块 2 break; default: n 与 case 1 和 case 2 不同时执行的代码 }
格式解释说明
switch表达式:可以是byte,short,int,char
JDK5以后可以是枚举
JDK7以后可以是字符串
case:后面的值就是要和表达式进行比较的值
break:表示程序到这里中断,跳出switch语句
default:如果所有的情况都不匹配,就执行这里,相当于if语句中的else
工作原理
A:首先设置表达式 n(通常是一个变量)
B:随后表达式的值会与结构中的每个 case 的值做比较,如果有就执行对应的语句体,看到break就结束。
C:如果没有匹配,就执行default的语句体。
注意事项
A:case后面只能是常量,不能是变量,而且,多个case后面的值不能出现相同的值
B:default可以省略吗?
可以省略,但是不建议,因为它的作用是对不正确的情况给出提示。
C:break可以省略吗?
可以省略,但是结果可能不是我们想要的。
会出现一个现象:case穿透,最终我们建议不要省略
D:default一定要在最后吗?
不是,可以在任意位置。但是建议在最后。
E:switch语句的结束条件
a:遇到break就结束了
b:执行到末尾就结束了
Case案例演示
public static void main(String[] args) { case1(); System.out.println("----------case1------------"); case2(); System.out.println("----------case2------------"); case3(); System.out.println("----------case3------------"); case4(); System.out.println("----------case4------------"); case4_0(); System.out.println("----------case4_0------------"); case4_1(); System.out.println("----------case4_1------------"); case5(); System.out.println("-----------case5-----------"); case6(); System.out.println("-----------case6-----------"); }
private static void case1() { switch(NUMBER){ case 9: System.out.println(9); break; case 10: System.out.println(10); break; case 11: System.out.println(11); break; default: System.out.println("都不匹配"); } } private static void case2() { switch(NUMBER){ case 9: System.out.println(9); case 10: System.out.println(10); case 11: System.out.println(11); default: System.out.println("都不匹配"); } } private static void case3() { switch(NUMBER){ default: System.out.println("都不匹配"); break; //break有无不影响结果 case 9: System.out.println(9); break; case 10: System.out.println(10); break; case 11: System.out.println(11); break; } } private static void case4() { switch(NUMBER){ default: System.out.println("都不匹配"); case 9: System.out.println(9); case 12: System.out.println(12); case 11: System.out.println(11); } } private static void case4_0() { switch(NUMBER){ default: System.out.println("都不匹配"); break; //和case4 比较 是有区别的 case 9: System.out.println(9); case 12: System.out.println(12); case 11: System.out.println(11); } } private static void case4_1() { switch(NUMBER){ default: System.out.println("都不匹配"); case 9: System.out.println(9); case 10: System.out.println(10); case 11: System.out.println(11); } } private static void case5() { switch(NUMBER){ default: System.out.println("都不匹配"); case 9: System.out.println(9); break; case 12: System.out.println(12); break; case 11: System.out.println(11); break; } } private static void case6() { switch(NUMBER){ default: System.out.println("都不匹配"); break; //case5 比较 是有区别的 case 9: System.out.println(9); break; case 12: System.out.println(12); break; case 11: System.out.println(11); break; } }
执行结果
10 ----------case1------------ 10 11 都不匹配 ----------case2------------ 10 ----------case3------------ 都不匹配 9 12 11 ----------case4------------ 都不匹配 ----------case4_0------------ 10 11 ----------case4_1------------ 都不匹配 9 -----------case5----------- 都不匹配 -----------case6-----------
总结:
case穿透和break有关,只有当遇到break时才会终止,不然会继续执行后面case中的代码块
default的位置不会影响执行结果,不管你编写的代码中default放在那里,这里的条件判断都是先按顺序比较其他非default值,当这些条件都不满足的时候,才跳转到default的相应代码处执行。
开开心心编码,快快乐乐生活。