目录
- 引言
- [一、先搞懂:switch 的核心逻辑(和 if 的区别)](#一、先搞懂:switch 的核心逻辑(和 if 的区别))
-
- [1.1 和 if 的核心区别(小白必记)](#1.1 和 if 的核心区别(小白必记))
- [1.2 switch 的核心前提(必须记牢)](#1.2 switch 的核心前提(必须记牢))
- [二、吃透语法:switch 的 "完整骨架"+ 逐部分拆解](#二、吃透语法:switch 的 “完整骨架”+ 逐部分拆解)
-
- [2.1 完整语法模板(死记硬背)](#2.1 完整语法模板(死记硬背))
- [2.2 逐部分拆解](#2.2 逐部分拆解)
-
- (1)switch (表达式)
- [(2)case 常量:](#(2)case 常量:)
- (3)break;
- (4)default:
- [三、实战例子:3 个生活场景,从简单到复杂](#三、实战例子:3 个生活场景,从简单到复杂)
-
- [3.1 场景 1:根据星期几安排活动(整数类型表达式)](#3.1 场景 1:根据星期几安排活动(整数类型表达式))
- [3.2 场景 2:根据等级发放奖励(字符串类型表达式)](#3.2 场景 2:根据等级发放奖励(字符串类型表达式))
- [3.3 场景 3:根据月份判断季节(case 穿透的合理使用)](#3.3 场景 3:根据月份判断季节(case 穿透的合理使用))
- [四、新手必避的 5 个 "致命坑"](#四、新手必避的 5 个 “致命坑”)
-
- [4.1 坑 1:表达式使用不支持的类型](#4.1 坑 1:表达式使用不支持的类型)
- [4.2 坑 2:case 后面用变量或表达式](#4.2 坑 2:case 后面用变量或表达式)
- [4.3 坑 3:漏写 break 导致 case 穿透(最常见)](#4.3 坑 3:漏写 break 导致 case 穿透(最常见))
- [4.4 坑 4:case 常量重复](#4.4 坑 4:case 常量重复)
- [4.5 坑 5:default 位置不当导致逻辑错误](#4.5 坑 5:default 位置不当导致逻辑错误)
- [五、switch 和 if-else if 怎么选?](#五、switch 和 if-else if 怎么选?)
- 总结
引言
上一节咱们学了if语句,能处理各种判断场景 ------ 不管是范围判断(比如 "分数≥60 及格")还是复杂逻辑判断(比如 "既是学生又有身份证")。但如果遇到 "等值判断",比如 "根据星期几安排活动""根据等级发放奖励",用if-else if写会显得有点繁琐,而switch语句就是专门解决这种场景的 "高效工具"。
比如 "周一上班、周二上课、周三健身...... 周日休息",用switch写能直接 "匹配值" 执行对应代码,比if-else if简洁明了。这一节咱们就把switch讲透:先搞懂它的核心逻辑(和if的区别),再学语法细节、实战例子,最后避开新手常踩的坑 ------ 全程用生活例子 + 超详细注释,保证刚学完if的你也能轻松掌握!
一、先搞懂:switch 的核心逻辑(和 if 的区别)
switch语句的核心逻辑是:根据 "表达式的具体值",匹配对应的 "case 常量",执行对应的代码块。就像去餐厅点菜 ------ 报出菜名(表达式的值),服务员直接给你对应的菜(执行对应代码),不用逐个问 "是不是这个、是不是那个"。
1.1 和 if 的核心区别(小白必记)
| 特点 | switch 语句 | if 语句 |
|---|---|---|
| 适用场景 | 多分支 "等值判断"(比如星期、等级、月份) | 范围判断、等值判断、复杂逻辑判断 |
| 判断方式 | 直接匹配 "值",只能是等值比较 | 可以是范围(>、≥)、等值(==)、逻辑组合(&&、 |
| 代码简洁度 | 等值判断时更简洁,一目了然 | 复杂判断时更灵活,等值判断繁琐 |
举个直观例子:判断星期几安排活动
-
用
if-else if写(繁琐,要逐个判断等值):javaint week = 3; if (week == 1) { System.out.println("周一:上班"); } else if (week == 2) { System.out.println("周二:上课"); } else if (week == 3) { System.out.println("周三:健身"); } // 还要写周四到周日,重复且繁琐 -
用
switch写(简洁,直接匹配值):javaint week = 3; switch (week) { case 1: System.out.println("周一:上班"); break; case 2: System.out.println("周二:上课"); break; case 3: System.out.println("周三:健身"); break; // 后续case直接加,清晰简洁 }
1.2 switch 的核心前提(必须记牢)
-
「表达式类型」有限制:只能是
byte、short、int、char、String(字符串)、枚举类型 ------ 不能是long、float、double,也不能是布尔值; -
「case 后面是常量」:case 后面必须是具体的常量(比如
1、"A"、"优秀"),不能是变量(比如case week)或表达式(比如case 1+2虽然能运行,但不推荐); -
「break 不能漏」:每个 case 执行完后,必须加
break语句,否则会 "穿透" 到下一个 case(后面详细讲)。
二、吃透语法:switch 的 "完整骨架"+ 逐部分拆解
2.1 完整语法模板(死记硬背)
java
switch (表达式) {
case 常量1:
// 表达式的值 == 常量1时,执行的代码块
执行语句1;
执行语句2;
break; // 跳出switch,不再执行后面的case
case 常量2:
// 表达式的值 == 常量2时,执行的代码块
执行语句3;
break;
case 常量3:
// 表达式的值 == 常量3时,执行的代码块
执行语句4;
break;
default:
// 表达式的值不匹配任何case时,执行的代码块(可选)
执行语句5;
// default后面可以不加break(因为是最后一个)
}
2.2 逐部分拆解
(1)switch (表达式)
-
作用:指定要 "判断的值",比如
week(星期)、grade(等级)、month(月份); -
合法类型示例:
-
整数类型:
int week = 3;、short grade = 2;; -
字符类型:
char level = 'A';; -
字符串类型:
String rank = "优秀";;
-
-
非法类型示例:
-
long num = 10; switch (num) { ... }(long 不支持); -
float score = 85.5f; switch (score) { ... }(float 不支持); -
boolean isPass = true; switch (isPass) { ... }(布尔值不支持)。
-
(2)case 常量:
-
作用:"匹配条件"------ 当表达式的值等于这个常量时,执行后面的代码;
-
注意事项:
-
常量必须唯一:不能有两个
case 1:或两个case "优秀":; -
常量类型要和表达式一致:比如表达式是
String rank,case 就只能是字符串常量(case "优秀":),不能是case 1:; -
case 顺序不影响匹配:但建议按 "逻辑顺序" 排列(比如星期 1 到 7、等级从高到低)。
-
(3)break;
-
作用:"跳出 switch 语句"------ 执行完当前 case 的代码后,不再往下执行其他 case;
-
关键提醒:如果漏写 break,会发生 "case 穿透"(后面避坑部分详细讲)。
(4)default:
-
作用:当表达式的值不匹配任何 case 时,执行的 "默认操作";
-
注意事项:
-
可选性:可以省略,如果省略且没有匹配的 case,switch 语句什么都不执行;
-
位置灵活:可以放在任意 case 前面,但建议放在最后(逻辑更清晰);
-
可以不加 break:因为 default 是最后一个,后面没有其他 case,加不加 break 都一样。
-
三、实战例子:3 个生活场景,从简单到复杂
3.1 场景 1:根据星期几安排活动(整数类型表达式)
代码示例
java
public static void main(String[] args) {
// 定义变量:星期几(1=周一,2=周二...7=周日)
int week = 5;
// switch判断:根据week的值匹配case
switch (week) {
case 1: // 匹配week=1(周一)
System.out.println("周一:早起上班,摸鱼学Java");
break; // 执行完跳出switch
case 2: // 匹配week=2(周二)
System.out.println("周二:下午有会议,提前准备PPT");
break;
case 3: // 匹配week=3(周三)
System.out.println("周三:下班去健身,跑步30分钟");
break;
case 4: // 匹配week=4(周四)
System.out.println("周四:晚上看Java教程,做练习题");
break;
case 5: // 匹配week=5(周五)
System.out.println("周五:下班约朋友吃火锅,放松一下");
break;
case 6: // 匹配week=6(周六)
System.out.println("周六:睡懒觉,下午去图书馆看书");
break;
case 7: // 匹配week=7(周日)
System.out.println("周日:整理房间,准备下周工作");
break;
default: // 没有匹配到1-7(比如week=8)
System.out.println("输入的星期不合法!");
}
}
执行结果(week=5):
Plain
周五:下班约朋友吃火锅,放松一下
3.2 场景 2:根据等级发放奖励(字符串类型表达式)
代码示例
java
public static void main(String[] args) {
// 定义变量:考试等级(优秀、良好、及格、不及格)
String grade = "良好";
// switch判断:字符串类型的表达式
switch (grade) {
case "优秀": // 匹配grade="优秀"
System.out.println("等级:优秀");
System.out.println("奖励:Java编程书籍+500元奖金");
break;
case "良好": // 匹配grade="良好"
System.out.println("等级:良好");
System.out.println("奖励:笔记本+200元奖金");
break;
case "及格": // 匹配grade="及格"
System.out.println("等级:及格");
System.out.println("奖励:钢笔一支");
break;
case "不及格": // 匹配grade="不及格"
System.out.println("等级:不及格");
System.out.println("奖励:Java基础100题(加强练习)");
break;
default: // 匹配不到上述等级(比如grade="中等")
System.out.println("等级不合法,请重新输入!");
}
}
执行结果(grade="良好"):
Plain
等级:良好
奖励:笔记本+200元奖金
3.3 场景 3:根据月份判断季节(case 穿透的合理使用)
有时候我们需要 "多个值对应同一个操作",比如 "3、4、5 月都是春天",这时候可以故意省略 break,利用 "case 穿透" 简化代码(这是 break 唯一可以省略的场景)。
代码示例
java
public static void main(String[] args) {
// 定义变量:月份(1-12)
int month = 4;
switch (month) {
case 3: // 3月
case 4: // 4月(穿透到3月的代码)
case 5: // 5月(穿透到3月的代码)
System.out.println(month + "月是春天,万物复苏~");
break; // 跳出switch,避免继续穿透
case 6: // 6月
case 7: // 7月
case 8: // 8月
System.out.println(month + "月是夏天,烈日炎炎~");
break;
case 9: // 9月
case 10: // 10月
case 11: // 11月
System.out.println(month + "月是秋天,硕果累累~");
break;
case 12: // 12月
case 1: // 1月
case 2: // 2月
System.out.println(month + "月是冬天,寒风刺骨~");
break;
default:
System.out.println("输入的月份不合法!");
}
}
执行结果(month=4):
Plain
4月是春天,万物复苏~
逻辑说明:
month=4 时,匹配case 4:,但没有 break,所以 "穿透" 到case 3:的代码(其实是执行case 4:后面的代码,因为前面的 case 没有代码),执行打印语句后,break 跳出,实现 "3、4、5 月对应同一个操作"。
四、新手必避的 5 个 "致命坑"
4.1 坑 1:表达式使用不支持的类型
-
错误示例:
javalong num = 2; switch (num) { // 错误:long类型不支持switch case 1: System.out.println("一"); break; } -
后果:编译报错!提示 "不兼容的类型:从 long 转换到 int 可能会有损失";
-
正确示例:
javaint num = 2; // 用int类型 switch (num) { case 1: System.out.println("一"); break; }
4.2 坑 2:case 后面用变量或表达式
-
错误示例:
javaint level = 1; int target = 1; switch (level) { case target: // 错误:case后面不能是变量 System.out.println("达标"); break; } -
后果:编译报错!提示 "case 表达式必须是常量表达式";
-
正确示例:
javaswitch (level) { case 1: // case后面是常量 System.out.println("达标"); break; }
4.3 坑 3:漏写 break 导致 case 穿透(最常见)
-
错误示例:
javaint week = 2; switch (week) { case 1: System.out.println("周一"); break; case 2: System.out.println("周二"); // 漏写break case 3: System.out.println("周三"); break; } -
后果:执行结果是 "周二" 和 "周三" 都打印 ------ 因为 case 2 没有 break,穿透到 case 3,执行了 case 3 的代码;
-
正确示例:
javacase 2: System.out.println("周二"); break; // 加上break,避免穿透
4.4 坑 4:case 常量重复
-
错误示例:
javaswitch (week) { case 1: System.out.println("周一"); break; case 1: // 错误:case常量重复 System.out.println("工作日"); break; } -
后果:编译报错!提示 "重复的 case 标签";
-
正确示例:
javaswitch (week) { case 1: System.out.println("周一"); System.out.println("工作日"); // 同一个case里写多个操作 break; }
4.5 坑 5:default 位置不当导致逻辑错误
-
错误示例:
javaint week = 3; switch (week) { default: System.out.println("不合法"); break; case 3: System.out.println("周三"); break; } -
后果:虽然 week=3 能匹配 case 3,执行正确,但 default 放在前面,逻辑不清晰(新手容易误以为 default 是第一个匹配);
-
正确示例:
javaswitch (week) { case 3: System.out.println("周三"); break; default: // 放在最后,逻辑清晰 System.out.println("不合法"); }
五、switch 和 if-else if 怎么选?
很多小白会纠结 "什么时候用 switch,什么时候用 if",记住这 3 个原则就行:
-
「等值判断 + 选项少」:用 switch(比如星期、月份、等级,选项明确且少);
-
「范围判断 / 复杂逻辑」:用 if-else if(比如 "分数≥90 优秀""既是学生又有身份证");
-
「选项多且等值」:也可以用 switch,但如果超过 10 个 case,建议用 if-else if(可读性更高)。
举个对比例子:判断 "分数等级":如果是 "优秀、良好、及格、不及格"(等值),用 switch;如果是 "90+、80-89、60-79、<60"(范围),用 if-else if。
总结
这一节咱们学了 switch 语句的核心用法,记住 3 个核心点:
-
核心逻辑:等值判断,匹配 case 常量执行对应代码,break 跳出;
-
适用场景:星期、月份、等级等 "固定等值" 的多分支判断,比 if-else if 简洁;
-
避坑关键:表达式类型合法、case 是常量、不重复、不漏写 break、default 放最后。
switch 和 if 是分支结构的两大核心工具,掌握它们后,程序的 "决策能力" 会大幅提升。