目录
- 引言
- 一、先搞懂:switch 的核心逻辑(和 if 的区别)
- 1.1 和 if 的核心区别(小白必记)
- 1.2 switch 的核心前提(必须记牢)
- 二、吃透语法:switch 的 “完整骨架”+ 逐部分拆解
- 2.1 完整语法模板(死记硬背)
- 2.2 逐部分拆解
- (1)switch (表达式)
- (2)case 常量:
- (3)break;
- (4)default:
- 三、实战例子:3 个生活场景,从简单到复杂
- 3.1 场景 1:根据星期几安排活动(整数类型表达式)
- 3.2 场景 2:根据等级发放奖励(字符串类型表达式)
- 3.3 场景 3:根据月份判断季节(case 穿透的合理使用)
- 四、新手必避的 5 个 “致命坑”
- 4.1 坑 1:表达式使用不支持的类型
- 4.2 坑 2:case 后面用变量或表达式
- 4.3 坑 3:漏写 break 导致 case 穿透(最常见)
- 4.4 坑 4:case 常量重复
- 4.5 坑 5:default 位置不当导致逻辑错误
- 五、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写(繁琐,要逐个判断等值):intweek=3;if(week==1){System.out.println("周一:上班");}elseif(week==2){System.out.println("周二:上课");}elseif(week==3){System.out.println("周三:健身");}// 还要写周四到周日,重复且繁琐用
switch写(简洁,直接匹配值):intweek=3;switch(week){case1:System.out.println("周一:上班");break;case2:System.out.println("周二:上课");break;case3: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 完整语法模板(死记硬背)
switch(表达式){case常量1:// 表达式的值 == 常量1时,执行的代码块执行语句1;执行语句2;break;// 跳出switch,不再执行后面的casecase常量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:根据星期几安排活动(整数类型表达式)
代码示例
publicstaticvoidmain(String[]args){// 定义变量:星期几(1=周一,2=周二...7=周日)intweek=5;// switch判断:根据week的值匹配caseswitch(week){case1:// 匹配week=1(周一)System.out.println("周一:早起上班,摸鱼学Java");break;// 执行完跳出switchcase2:// 匹配week=2(周二)System.out.println("周二:下午有会议,提前准备PPT");break;case3:// 匹配week=3(周三)System.out.println("周三:下班去健身,跑步30分钟");break;case4:// 匹配week=4(周四)System.out.println("周四:晚上看Java教程,做练习题");break;case5:// 匹配week=5(周五)System.out.println("周五:下班约朋友吃火锅,放松一下");break;case6:// 匹配week=6(周六)System.out.println("周六:睡懒觉,下午去图书馆看书");break;case7:// 匹配week=7(周日)System.out.println("周日:整理房间,准备下周工作");break;default:// 没有匹配到1-7(比如week=8)System.out.println("输入的星期不合法!");}}执行结果(week=5):
周五:下班约朋友吃火锅,放松一下3.2 场景 2:根据等级发放奖励(字符串类型表达式)
代码示例
publicstaticvoidmain(String[]args){// 定义变量:考试等级(优秀、良好、及格、不及格)Stringgrade="良好";// 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=“良好”):
等级:良好 奖励:笔记本+200元奖金3.3 场景 3:根据月份判断季节(case 穿透的合理使用)
有时候我们需要 “多个值对应同一个操作”,比如 “3、4、5 月都是春天”,这时候可以故意省略 break,利用 “case 穿透” 简化代码(这是 break 唯一可以省略的场景)。
代码示例
publicstaticvoidmain(String[]args){// 定义变量:月份(1-12)intmonth=4;switch(month){case3:// 3月case4:// 4月(穿透到3月的代码)case5:// 5月(穿透到3月的代码)System.out.println(month+"月是春天,万物复苏~");break;// 跳出switch,避免继续穿透case6:// 6月case7:// 7月case8:// 8月System.out.println(month+"月是夏天,烈日炎炎~");break;case9:// 9月case10:// 10月case11:// 11月System.out.println(month+"月是秋天,硕果累累~");break;case12:// 12月case1:// 1月case2:// 2月System.out.println(month+"月是冬天,寒风刺骨~");break;default:System.out.println("输入的月份不合法!");}}执行结果(month=4):
4月是春天,万物复苏~逻辑说明:
month=4 时,匹配case 4:,但没有 break,所以 “穿透” 到case 3:的代码(其实是执行case 4:后面的代码,因为前面的 case 没有代码),执行打印语句后,break 跳出,实现 “3、4、5 月对应同一个操作”。
四、新手必避的 5 个 “致命坑”
4.1 坑 1:表达式使用不支持的类型
错误示例:
longnum=2;switch(num){// 错误:long类型不支持switchcase1:System.out.println("一");break;}后果:编译报错!提示 “不兼容的类型:从 long 转换到 int 可能会有损失”;
正确示例:
intnum=2;// 用int类型switch(num){case1:System.out.println("一");break;}
4.2 坑 2:case 后面用变量或表达式
错误示例:
intlevel=1;inttarget=1;switch(level){casetarget:// 错误:case后面不能是变量System.out.println("达标");break;}后果:编译报错!提示 “case 表达式必须是常量表达式”;
正确示例:
switch(level){case1:// case后面是常量System.out.println("达标");break;}
4.3 坑 3:漏写 break 导致 case 穿透(最常见)
错误示例:
intweek=2;switch(week){case1:System.out.println("周一");break;case2:System.out.println("周二");// 漏写breakcase3:System.out.println("周三");break;}后果:执行结果是 “周二” 和 “周三” 都打印 —— 因为 case 2 没有 break,穿透到 case 3,执行了 case 3 的代码;
正确示例:
case2:System.out.println("周二");break;// 加上break,避免穿透
4.4 坑 4:case 常量重复
错误示例:
switch(week){case1:System.out.println("周一");break;case1:// 错误:case常量重复System.out.println("工作日");break;}后果:编译报错!提示 “重复的 case 标签”;
正确示例:
switch(week){case1:System.out.println("周一");System.out.println("工作日");// 同一个case里写多个操作break;}
4.5 坑 5:default 位置不当导致逻辑错误
错误示例:
intweek=3;switch(week){default:System.out.println("不合法");break;case3:System.out.println("周三");break;}后果:虽然 week=3 能匹配 case 3,执行正确,但 default 放在前面,逻辑不清晰(新手容易误以为 default 是第一个匹配);
正确示例:
switch(week){case3: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 是分支结构的两大核心工具,掌握它们后,程序的 “决策能力” 会大幅提升。