news 2026/1/31 6:37:03

【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/1/30 14:16:52

如何实现SSH连接不掉线?Kitty终端持久化会话全解析

如何实现SSH连接不掉线&#xff1f;Kitty终端持久化会话全解析 【免费下载链接】kitty Cross-platform, fast, feature-rich, GPU based terminal 项目地址: https://gitcode.com/GitHub_Trending/ki/kitty 当你正在进行重要的远程服务器操作时&#xff0c;突然的SSH连接…

作者头像 李华
网站建设 2026/1/31 0:14:34

Lima完整指南:如何在macOS上轻松运行Linux虚拟机

Lima完整指南&#xff1a;如何在macOS上轻松运行Linux虚拟机 【免费下载链接】lima Linux virtual machines, with a focus on running containers 项目地址: https://gitcode.com/GitHub_Trending/lim/lima 想要在macOS上运行Linux虚拟机&#xff1f;Lima就是你的终极解…

作者头像 李华
网站建设 2026/1/29 21:36:59

JavaScript高级:解构赋值和forEach函数

JavaScript高级-第二天 文章目录JavaScript高级-第二天解构赋值&#xff08;重点&#xff09;数组解构对象解构forEach遍历数组&#xff08;重点&#xff09;filter筛选数组&#xff08;重点&#xff09;解构赋值&#xff08;重点&#xff09; 知道解构的语法及分类&#xff0c…

作者头像 李华
网站建设 2026/1/31 6:37:15

构建高效的接口自动化测试框架思路

部署运行你感兴趣的模型镜像一键部署 在选择接口测试自动化框架时&#xff0c;需要根据团队的技术栈和项目需求来综合考虑。对于测试团队来说&#xff0c;使用Python相关的测试框架更为便捷。无论选择哪种框架&#xff0c;重要的是确保 框架功能完备&#xff0c;易于维护和扩展…

作者头像 李华
网站建设 2026/1/30 20:12:41

终极指南:PVNet像素投票网络让6DoF姿态估计变得简单快速

终极指南&#xff1a;PVNet像素投票网络让6DoF姿态估计变得简单快速 【免费下载链接】clean-pvnet Code for "PVNet: Pixel-wise Voting Network for 6DoF Pose Estimation" CVPR 2019 oral 项目地址: https://gitcode.com/gh_mirrors/cl/clean-pvnet 想要让机…

作者头像 李华
网站建设 2026/1/30 22:11:45

打工模拟器4.0(简单版)

#include<bits/stdc.h> /*#include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> #include <stdbool.h> #include <unistd.h>*/// 定义难度枚举 typedef enum {EASY,NORMAL,HARD } Difficulty;// 定义游戏…

作者头像 李华