前面提到條件語句的標準格式為“if (條件) { /* 條件成立時的操作代碼 */ } else { /* 條件不成立時的操作代碼 */ }”,乍看之下仿佛只有兩個分支,一個是條件成立時的分支,另一個是條件不成立時的分支。很明顯僅僅兩個分支是不能滿足複雜的業務需求的,自然Java代碼也不會這麼傻瓜到 ...
前面提到條件語句的標準格式為“if (條件) { /* 條件成立時的操作代碼 */ } else { /* 條件不成立時的操作代碼 */ }”,乍看之下仿佛只有兩個分支,一個是條件成立時的分支,另一個是條件不成立時的分支。很明顯僅僅兩個分支是不能滿足複雜的業務需求的,自然Java代碼也不會這麼傻瓜到固步自封,為此else分支還允許嫁接別的if條件,形如“if (條件一) { } else if (條件二) { } else if (條件三) { } else { }”這樣,不管來幾個條件分支,都能通過“else if”加以判斷和處理。像之前的猜謎游戲,輸入數字1時列印涼風有信的謎底,輸入數字2時列印秋月無邊的謎底,現在規定輸入其它數字要列印“按鍵有誤”的提示,此時一共存在三個條件分支,往原來的if/else語句添加一個“else if”即可實現三個分支。
下麵便是改寫成三個分支之後的代碼例子:
System.out.println("涼風有信,秋月無邊。打二字"); System.out.println("獲取“涼風有信”的謎底請按1,獲取“秋月無邊”的謎底請按2"); Scanner scan = new Scanner(System.in); // 從控制台接收輸入文本 /* nextLine方法表示接收一行文字,以回車鍵結尾 */ int seq = scan.nextInt(); if (seq == 1) { // 條件式子1為真時,進入第一個if分支處理 System.out.println("涼風有信的謎底是“諷”"); } else if (seq == 2) { // 否則的話,繼續判斷條件式子2為真時,進入第二個if分支處理 System.out.println("秋月無邊的謎底是“二”"); } else { // 否則(前面的判斷條件都不滿足),進入else分支處理 System.out.println("您的按鍵有誤"); }
可要是分支數量多了起來,豈不是得寫一樣多的“if else”?這種做法雖然可行,但畢竟大費周折,條理也不夠清晰。故而早期的設計師構造了“swicth-case”語句,也被稱作是多路分支結構,在該控制流程之中,對每個分支都指定了一個數值把關,只有設定的變數符合數值要求,才能進到相應的分支處理。這樣做的好處是,方便編譯器在底層進行優化,既可利用二分查找法加快尋找速度,又可採取地址映射直接找到指定分支。相容並蓄的Java自然繼承了有利於調優的“swicth-case”,多路分支語句除了swicth和case,還額外增加了break和default兩個關鍵字。break的作用是跳出整個多路分支,不再執行本分支及其餘分支的代碼;default的作用相當於else,所有不滿足任何已知條件的數值,都進入到default這個預設分支來處理。
仍以猜謎游戲為例,使用“swicth-case”改寫後的多路分支代碼如下所示:
// switch允許判斷某個變數的多個取值,並分別進行單獨處理 switch (seq) { case 1: // seq值為1時進入該分支 System.out.println("涼風有信的謎底是“諷”"); break; // 跳出多路分支。即跳到switch分支的右花括弧之後 case 2: // seq值為2時進入該分支 System.out.println("秋月無邊的謎底是“二”"); break; // 跳出多路分支。即跳到switch分支的右花括弧之後 default: // seq值為其它時進入該分支 System.out.println("您的按鍵有誤"); break; // 跳出多路分支。即跳到switch分支的右花括弧之後 } System.out.println("猜謎結束");
多路分支固然好用,但要特別註意以下幾點:
1、每個case分支末尾務必要加上break語句,否則即使該分支走完了也不會跳出多路分支,而是繼續執行該分支的後面一個分支代碼,顯然這並非程式員的本意。
2、多路分支只能判斷整型、字元串、枚舉這三種類型的變數,無法判斷布爾、浮點、雙精度等其它類型的變數。
3、case語句後面的數值,只能用來進行相等判斷,不能開展大於、小於等其它關係運算。