第一部分:switch-case 基本语法

掌握多分支选择结构的写法与执行流程

学习目标

理解 switch 结构、case 标签、break、default 的作用

1

经典语法模板

switch (表达式) {
	case 常量1:
	// 语句块1
	break;
	case 常量2:
	// 语句块2
	break;
	default:
	// 默认语句块
}
2

数字菜单示例

int choice = 2;
switch (choice) {
	case 1:
System.out.println("查询余额");
	break;
	case 2:
System.out.println("转账");
	break;
	default:
System.out.println("无效选项");
}

第二部分:穿透(Fall-through)与 break

理解 case 贯穿执行原理,合理使用 break

1

无 break 的穿透示例

int score = 85;
switch (score / 10) {
	case 10:
	case 9:
System.out.println("优秀");
	break;
	case 8:
System.out.println("良好");
	break;
	default:
System.out.println("再接再厉");
}
2

利用穿透合并月份天数

int month = 2;
switch (month) {
	case 1:
	case 3:
	case 5:
	case 7:
	case 8:
	case 10:
	case 12:
System.out.println("31天");
	break;
	case 4:
	case 6:
	case 9:
	case 11:
System.out.println("30天");
	break;
	case 2:
System.out.println("28或29天");
	break;
}

第三部分:switch 支持的数据类型

Java 7 以前 vs Java 7+ 的差异

Java 7 以前

  • byte, short, char, int
  • 对应的包装类 Byte, Short, Character, Integer
  • enum 枚举

Java 7+ 新增

  • String 字符串(最常用)
  • enum 枚举
1

String switch 示例

String day = "Mon";
switch (day.toLowerCase()) {
	case "mon":
System.out.println("星期一");
	break;
	case "tue":
System.out.println("星期二");
	break;
	default:
System.out.println("其他");
}

第四部分:枚举 switch

类型安全、可读性强的最佳实践

1

定义枚举

enum Direction {
EAST, SOUTH, WEST, NORTH
}
2

枚举 switch 示例

Direction dir = Direction.EAST;
switch (dir) {
	case EAST:
System.out.println("向东走");
	break;
	case WEST:
System.out.println("向西走");
	break;
	default:
System.out.println("原地转圈");
}

第五部分:switch vs if-else 对比

何时用 switch,何时用 if-else

维度 switch if-else
可读性 固定值分支清晰 范围/布尔逻辑直观
性能 常量展开,跳转表 顺序判断,分支预测
类型限制 仅支持特定类型 任意布尔表达式
分支数量 ≥4 时优势明显 少量分支更灵活

选择原则

  • 分支值为固定常量 → switch
  • 分支为范围或布尔表达式 → if-else

第六部分:综合案例:简易 ATM 菜单

用 switch 实现完整交互流程

1

需求与流程

  • 1-查询余额
  • 2-取款
  • 3-存款
  • 4-退出
2

完整代码

import java.util.Scanner;

public class MiniATM {
	public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
	double balance = 1000;

	while (true) {
System.out.println("=== 简易 ATM ===");
System.out.println("1. 查询余额");
System.out.println("2. 取款");
System.out.println("3. 存款");
System.out.println("4. 退出");
System.out.print("请选择:");
	int choice = sc.nextInt();

	switch (choice) {
	case 1:
    System.out.println("余额:" + balance);
	break;
	case 2:
    System.out.print("取款金额:");
	double wd = sc.nextDouble();
	if (wd > balance) {
	System.out.println("余额不足");
    } else {
	balance -= wd;
	System.out.println("取款成功");
    }
	break;
	case 3:
    System.out.print("存款金额:");
	double dp = sc.nextDouble();
    balance += dp;
    System.out.println("存款成功");
	break;
	case 4:
    System.out.println("感谢使用,再见!");
	return;
	default:
    System.out.println("无效选项,请重新输入");
}
}
}
}

进阶挑战

  • 增加转账、修改密码功能
  • 用枚举替代数字菜单
  • 封装成方法,提高可读性

第七部分:常见问题与调试技巧

快速定位并修复 switch 中的错误

问题1:case 标签类型不匹配

// 错误:score 是 int,case 不能是 double
switch (score) {
	case 90.5: // 编译错误
}

问题2:遗漏 break 导致穿透

switch (month) {
	case 1:
	// 忘记 break,会继续执行 case 2
	case 2:
...
}

问题3:String case 忽略大小写

// 解决:统一转为小写或大写
switch (input.toLowerCase()) {
	case "start":
}

知识总结

两分钟回顾本节全部要点,建议收藏备查

核心语法速记

  • switch:多分支选择
  • case:常量标签
  • break:防止穿透
  • default:默认分支

易错点提醒

  • case 值必须是常量
  • String 需统一大小写
  • 枚举 switch 无需枚举名前缀
  • 复杂逻辑优先 if-else

最佳实践

  • ≥4 个固定分支用 switch
  • 穿透需注释说明
  • 枚举 switch 用于状态机
  • IDE 自动生成 switch-case