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的相應程式碼處執行。