掌握 Java switch 语句的基本语法与执行机制
理解 case、break 和 default 的作用
能够使用 switch 处理 int、String、枚举和包装类等类型
了解“穿透”行为及其合理应用场景
学会编写嵌套 switch 和使用枚举优化代码结构
switch 是 Java 中的一种多路分支控制语句,用于根据一个表达式的值,从多个选项中选择一条执行路径。
✅ 它是
if-else-if链的更清晰、高效的替代方案,尤其适用于离散值匹配场景。
switch 表达式可以是以下类型:
基本整型:byte、short、char、int
对应的包装类:Byte、Short、Character、Integer
String(从 Java 7 开始支持)
枚举类型(enum)
switch (expression) {
case value1:
// 语句
break; // 可选,但强烈建议使用
case value2:
// 语句
break;
...
default:
// 所有 case 都不匹配时执行
}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");
}
}
}Smallint 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 的 case 块中再写一个 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✅ 内外层
switch的case常量互不影响,因为各自有独立的作用域。
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)。
不影响逻辑判断,但会影响穿透行为。
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,输出3;default虽在前面,但未被跳转到,所以不执行。
✅ 合法:
switch (x + 1) {
case 3: // 常量表达式
}❌ 非法:
int x = 2, y = 1;
switch (x) {
case x + y: // 错误!非常量表达式
}
// 编译错误:constant expression requiredJava 自动拆箱(unboxing),允许使用包装类:
Integer age = 25;
switch (age) { // 自动转为 int
case 25:
System.out.println("You are 25.");
break;
default:
System.out.println("Age not matched.");
}同样适用于 Character、Byte 等。
为什么 Java switch 不支持 long 类型?从 JVM 指令角度简要解释。
以下代码输出什么?为什么?
String s = null;
switch (s) {
case "hello": System.out.println("Hello"); break;
default: System.out.println("Default");
}
如何将一个包含 10 个 if-else if 分支的代码重构为 switch?在什么情况下不适合重构?