跳到内容

元数据卡

  • 前置知识:if/else 分支逻辑
  • 预计时间:10 分钟
  • 完成标志:能用 switch 替代多路 if-else,理解 break 和穿透

你走进铁匠铺,阿花在柜台上摆了三种货品:

"大剑 50 铜币,盾牌 30 铜币,药水 10 铜币。你要哪个?"

if-else 也能写,但每次判断都调 equals,有点啰嗦。更自然的写法是 switch——精准匹配一个值:

java
String choice = "大剑";

switch (choice) {
    case "大剑":
        System.out.println("50 铜币");
        break;
    case "盾牌":
        System.out.println("30 铜币");
        break;
    case "药水":
        System.out.println("10 铜币");
        break;
    default:
        System.out.println("没有这个商品");
}

语言:Java 17+ 预期输出50 铜币

Python 差异: Python 3.10+ 有 match-case,不需要 breakcase "大剑": print("50 铜币"),默认用 case _C++ 差异: 语法类似,但 C++ 的 switch 只支持整数和枚举,不支持 String。


那个烦人的 break——以及穿透

如果去掉 break 会怎样:

java
String choice = "大剑";
switch (choice) {
    case "大剑":
        System.out.println("50 铜币");   // 没有 break!
    case "盾牌":
        System.out.println("30 铜币");
        break;
    default:
        System.out.println("没有这个商品");
}

预期输出

50 铜币
30 铜币

这叫穿透(fall-through)——一个 case 执行完后直接"掉进"下一个,不检查。大多数时候是 bug,但少数场景是特性——比如多个 case 共享代码:

java
int day = 3;
switch (day) {
    case 1: case 2: case 3: case 4: case 5:
        System.out.println("工作日");
        break;
    case 6: case 7:
        System.out.println("周末");
        break;
}

语言:Java 预期输出工作日


Java 14+ 箭头语法——更干净

从 Java 14 开始,switch 有了箭头语法——不用写 break,没有穿透:

java
String choice = "药水";

String price = switch (choice) {
    case "大剑" -> "50 铜币";
    case "盾牌" -> "30 铜币";
    case "药水" -> "10 铜币";
    default -> "没有这个商品";
};

System.out.println(price); // 10 铜币

语言:Java 17+(需 Java 14+) 预期输出10 铜币

箭头 switch 还能用 yield 处理多行代码块,并且可以直接赋值给变量——老式冒号 switch 不行。


旅人笔记

switch 专治"同一个变量对不同的值做不同的事"。break 防穿透。箭头语法更干净。忘了写 break?用箭头语法直接从源头消灭这个问题。

→ 下一步:while 与 for 循环

Built with VitePress | Software Systems Atlas