源本科技 | 码上会

Java 中的 switch 语句

2025/12/25
20
0

学习目标

  • 掌握 Java switch 语句的基本语法与执行机制

  • 理解 casebreakdefault 的作用

  • 能够使用 switch 处理 intString、枚举和包装类等类型

  • 了解“穿透”行为及其合理应用场景

  • 学会编写嵌套 switch 和使用枚举优化代码结构


什么是 Switch 语句?

switch 是 Java 中的一种多路分支控制语句,用于根据一个表达式的值,从多个选项中选择一条执行路径。

✅ 它是 if-else-if 链的更清晰、高效的替代方案,尤其适用于离散值匹配场景。


支持的数据类型(Java 7+)

switch 表达式可以是以下类型:

  • 基本整型:byteshortcharint

  • 对应的包装类:ByteShortCharacterInteger

  • String(从 Java 7 开始支持)

  • 枚举类型(enum


基本语法

switch (expression) {
    case value1:
        // 语句
        break; // 可选,但强烈建议使用
    case value2:
        // 语句
        break;
    ...
    default:
        // 所有 case 都不匹配时执行
}

示例 1:基础用法

public class Main {
    // 服装尺码
    public static void main(String[] args) {
        int size = 2;

        switch (size) {
            case 1:
                System.out.println("Extra Small");
                break;
            case 2:
                System.out.println("Small");
                break;
            case 3:
                System.out.println("Medium");
                break;
            case 4:
                System.out.println("Large");
                break;
            case 5:
                System.out.println("Extra Large");
                break;
            default:
                System.out.println("Invalid size number");
        }
    }
}
Small

关键规则与注意事项

规则

说明

Case 值必须是常量

1'A'"hello"、枚举常量,不能是变量或表达式(如 x + y

不允许重复的 case 值

编译时报错

break 是可选的,但推荐使用

否则会发生 fall-through(穿透)

default 是可选的

可放在任意位置,但通常放最后

穿透

若无 break,程序会继续执行下一个 case 的代码


示例 2:利用穿透实现分组逻辑

int day = 2;
String dayType;

switch (day) {
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
        dayType = "Weekday";
        break;
    case 6:
    case 7:
        dayType = "Weekend";
        break;
    default:
        dayType = "Invalid daytype";
}
System.out.println("Tuesday is a " + dayType);

✅ 这里多个 case 共享同一段逻辑,故意省略 break 是合理且常见的用法。


嵌套 Switch 语句

可以在一个 switchcase 块中再写一个 switch,称为嵌套 switch

String Branch = "CSE";
int year = 2;

switch (year) {
    case 1:
        System.out.println("elective courses : Advance english, Algebra");
        break;
    case 2:
        switch (Branch) {
            case "CSE":
            case "CCE":
                System.out.println("elective courses : Machine Learning, Big Data");
                break;
            case "ECE":
                System.out.println("elective courses : Antenna Engineering");
                break;
            default:
                System.out.println("Elective courses : Optimization");
        }
}
elective courses : Machine Learning, Big Data

✅ 内外层 switchcase 常量互不影响,因为各自有独立的作用域。


使用 Enum 提升安全性与可读性

public class Main {
    enum Day { Sun, Mon, Tue, Wed, Thu, Fri, Sat }

    public static void main(String args[]) {
        for (Day d : Day.values()) {
            switch (d) {
                case Sun: System.out.println("Sunday"); break;
                case Mon: System.out.println("Monday"); break;
                case Tue: System.out.println("Tuesday"); break;
                case Wed: System.out.println("Wednesday"); break;
                case Thu: System.out.println("Thursday"); break;
                case Fri: System.out.println("Friday"); break;
                case Sat: System.out.println("Saturday"); break;
            }
        }
    }
}

✅ 枚举确保值的合法性,避免非法输入,且编译器可检查是否覆盖所有情况(配合 IDE)。


default 的位置影响执行吗?

不影响逻辑判断,但会影响穿透行为

int i = 2;
switch (i) {
    // default 在中间
    default:
        System.out.println("Default");
    case 1:
        System.out.println(1);
        break;
    case 2:
        System.out.println(2);
    case 3:
        System.out.println(3);
}
2
3

🔍 解释:匹配到 case 2,输出 2没有 break,继续执行 case 3,输出 3default 虽在前面,但未被跳转到,所以不执行。


Case 标签必须是常量表达式

✅ 合法:

switch (x + 1) {
    case 3: // 常量表达式
}

❌ 非法:

int x = 2, y = 1;
switch (x) {
    case x + y: // 错误!非常量表达式
}
// 编译错误:constant expression required

包装类在 Switch 中的使用

Java 自动拆箱(unboxing),允许使用包装类:

Integer age = 25;
switch (age) { // 自动转为 int
    case 25:
        System.out.println("You are 25.");
        break;
    default:
        System.out.println("Age not matched.");
}

同样适用于 CharacterByte 等。


重点总结

特性

说明

适用类型

byte/short/char/int、对应包装类、Stringenum

Case 要求

必须是编译期常量,不可重复

Break 作用

防止穿透,避免意外执行后续 case

Default 位置

可任意放置,但逻辑上只在无匹配时执行

穿透用途

可用于多个 case 共享同一逻辑

嵌套支持

完全支持,内外层互不干扰

枚举优势

类型安全、可读性强、防止非法值


思考题

  1. 为什么 Java switch 不支持 long 类型?从 JVM 指令角度简要解释。

  2. 以下代码输出什么?为什么?

    String s = null;
    switch (s) {
        case "hello": System.out.println("Hello"); break;
        default: System.out.println("Default");
    }
    
  3. 如何将一个包含 10 个 if-else if 分支的代码重构为 switch?在什么情况下不适合重构?