news 2026/4/18 15:23:30

【Java SE 基础学习打卡】23 分支语句 - switch

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Java SE 基础学习打卡】23 分支语句 - switch

目录

  • 引言
  • 一、先搞懂: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 的核心前提(必须记牢)

  1. 「表达式类型」有限制:只能是byteshortintcharString(字符串)、枚举类型 —— 不能是longfloatdouble,也不能是布尔值;

  2. 「case 后面是常量」:case 后面必须是具体的常量(比如1"A""优秀"),不能是变量(比如case week)或表达式(比如case 1+2虽然能运行,但不推荐);

  3. 「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 个原则就行:

  1. 「等值判断 + 选项少」:用 switch(比如星期、月份、等级,选项明确且少);

  2. 「范围判断 / 复杂逻辑」:用 if-else if(比如 “分数≥90 优秀”“既是学生又有身份证”);

  3. 「选项多且等值」:也可以用 switch,但如果超过 10 个 case,建议用 if-else if(可读性更高)。

举个对比例子:判断 “分数等级”:如果是 “优秀、良好、及格、不及格”(等值),用 switch;如果是 “90+、80-89、60-79、<60”(范围),用 if-else if。

总结

这一节咱们学了 switch 语句的核心用法,记住 3 个核心点:

  1. 核心逻辑:等值判断,匹配 case 常量执行对应代码,break 跳出;

  2. 适用场景:星期、月份、等级等 “固定等值” 的多分支判断,比 if-else if 简洁;

  3. 避坑关键:表达式类型合法、case 是常量、不重复、不漏写 break、default 放最后。

switch 和 if 是分支结构的两大核心工具,掌握它们后,程序的 “决策能力” 会大幅提升。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 3:55:50

算法备案五大类型:如何为你的算法精准“画像”?

跟着《互联网信息服务算法推荐管理规定》的实施&#xff0c;算法备案变为众多企业必须要直面的合规现实。但对于第一次进行备案的企业来说&#xff0c;最先遇到的疑问不是材料资质的问题&#xff0c;而是&#xff1a;“我的算法&#xff0c;究竟该归属于哪一类&#xff1f;” 这…

作者头像 李华
网站建设 2026/4/18 3:57:07

OpenAI绝地反击:GPT-5.2紧急上线,以“最强职场模型”硬刚Gemini 3

【摘要】OpenAI紧急发布GPT-5.2&#xff0c;精准定位“最强职场模型”&#xff0c;以应对谷歌Gemini 3的竞争压力。此举标志着AI从通用助手向深度赋能专业工作流的生产力工具演进。引言AI领域的竞争节奏正在以超乎想象的速度加快。距离上一代模型发布不足一月&#xff0c;OpenA…

作者头像 李华
网站建设 2026/4/18 5:35:14

超细致的性能测试流程,你get了吗?

性能测试&#xff1a;利用工具模拟大量用户操作&#xff0c;验证系统承受的负载情况。 性能测试的目的&#xff1a;找到潜在的性能问题或瓶颈&#xff0c;分析并解决&#xff1b;找出性能变化趋势&#xff0c;为后续扩展系统提供参考。 测试监控&#xff1a;基准测试、配置测…

作者头像 李华
网站建设 2026/4/18 14:14:58

TorchAO完整指南:掌握量化与稀疏化技术快速提升AI模型性能

TorchAO完整指南&#xff1a;掌握量化与稀疏化技术快速提升AI模型性能 【免费下载链接】ao Native PyTorch library for quantization and sparsity 项目地址: https://gitcode.com/GitHub_Trending/ao2/ao 想要让你的PyTorch模型运行更快、占用更少资源吗&#xff1f;T…

作者头像 李华
网站建设 2026/4/18 4:25:12

云端算力:数字时代的核心引擎与创新基石

云端算力&#xff1a;数字时代的核心引擎与创新基石在数字经济加速渗透的今天&#xff0c;云端算力正以不可逆转的趋势重塑产业格局。从AI大模型训练到工业互联网实时分析&#xff0c;从元宇宙场景构建到全球科研协作&#xff0c;云端算力已成为驱动技术突破、产业升级与社会进…

作者头像 李华
网站建设 2026/4/18 4:30:29

Day33 类的装饰器

知识点&#xff1a; 1.类的装饰器 2.装饰器思想的进一步理解&#xff1a;外部修改、动态 3.类方法的定义&#xff1a;内部定义和外部定义 浙大疏锦行

作者头像 李华