第一部分: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