switch (表達式) {
case 常量1: 語句1; break;
case 常量2: 語句2; break;
...
default: 語句N; // 可選
}
| 規則 | 說明 | 示例 |
|---|---|---|
| 表達式類型 | Java 5-6: int/char/byte/short/Enum Java 7+: +String Java 12+: +模式匹配(預覽) | switch(ch) ✅switch(str) ✅(7+) |
| case 標簽 | 編譯期常量表達式,不可為變量 | case 1+2: ✅case x: ❌ |
| break 作用 | 跳出 switch,缺失導致貫穿執行下一 case | 見下文 |
| default | 無匹配時執行,可置任意位置 | 通常放最後 |
| 作用域 | case 塊不自動形成作用域,需 {} 宣告局部變量 | 見陷阱 |
int n = 1;
switch (n) {
case 1: System.out.print("A ");
case 2: System.out.print("B ");
case 3: System.out.print("C ");
default: System.out.print("D ");
}
// 輸出:A B C D (無 break 貫穿)
switch (x) {
case 1:
int a = 10; // 編譯錯誤!case 無獨立作用域
break;
case 2:
// a 仍可見但未初始化,極易出錯
}
// 正確:用 {} 形成塊作用域
switch (x) {
case 1: {
int a = 10; // 合法
break;
}
case 2: { ... }
}
String result = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> "6";
case TUESDAY -> "7";
case THURSDAY, SATURDAY -> "8";
case WEDNESDAY -> "9";
default -> throw new IllegalStateException(day + "");
};
->:無貫穿、自動 break、返回值;case ...: 保留兼容;yield 關鍵字在塊中返回值。switch,編譯器提示未覆蓋值;switch 內部轉 hashCode + equals,性能優於 if-else 鏈;case A: case B:;