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

目录

  • 引言
  • [一、先搞懂:switch 的核心逻辑(和 if 的区别)](#一、先搞懂:switch 的核心逻辑(和 if 的区别))
    • [1.1 和 if 的核心区别(小白必记)](#1.1 和 if 的核心区别(小白必记))
    • [1.2 switch 的核心前提(必须记牢)](#1.2 switch 的核心前提(必须记牢))
  • [二、吃透语法:switch 的 "完整骨架"+ 逐部分拆解](#二、吃透语法:switch 的 “完整骨架”+ 逐部分拆解)
  • [三、实战例子: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写(繁琐,要逐个判断等值):

    java 复制代码
    int week = 3;
    if (week == 1) {
        System.out.println("周一:上班");
    } else if (week == 2) {
        System.out.println("周二:上课");
    } else if (week == 3) {
        System.out.println("周三:健身");
    } // 还要写周四到周日,重复且繁琐
  • switch写(简洁,直接匹配值):

    java 复制代码
    int 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 的核心前提(必须记牢)

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

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

  3. 「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:表达式使用不支持的类型

  • 错误示例

    java 复制代码
    long num = 2;
    switch (num) { // 错误:long类型不支持switch
        case 1:
            System.out.println("一");
            break;
    }
  • 后果:编译报错!提示 "不兼容的类型:从 long 转换到 int 可能会有损失";

  • 正确示例

    java 复制代码
    int num = 2; // 用int类型
    switch (num) {
        case 1:
            System.out.println("一");
            break;
    }

4.2 坑 2:case 后面用变量或表达式

  • 错误示例

    java 复制代码
    int level = 1;
    int target = 1;
    switch (level) {
        case target: // 错误:case后面不能是变量
            System.out.println("达标");
            break;
    }
  • 后果:编译报错!提示 "case 表达式必须是常量表达式";

  • 正确示例

    java 复制代码
    switch (level) {
        case 1: // case后面是常量
            System.out.println("达标");
            break;
    }

4.3 坑 3:漏写 break 导致 case 穿透(最常见)

  • 错误示例

    java 复制代码
    int 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 的代码;

  • 正确示例

    java 复制代码
    case 2:
        System.out.println("周二");
        break; // 加上break,避免穿透

4.4 坑 4:case 常量重复

  • 错误示例

    java 复制代码
    switch (week) {
        case 1:
            System.out.println("周一");
            break;
        case 1: // 错误:case常量重复
            System.out.println("工作日");
            break;
    }
  • 后果:编译报错!提示 "重复的 case 标签";

  • 正确示例

    java 复制代码
    switch (week) {
        case 1:
            System.out.println("周一");
            System.out.println("工作日"); // 同一个case里写多个操作
            break;
    }

4.5 坑 5:default 位置不当导致逻辑错误

  • 错误示例

    java 复制代码
    int week = 3;
    switch (week) {
        default:
            System.out.println("不合法");
            break;
        case 3:
            System.out.println("周三");
            break;
    }
  • 后果:虽然 week=3 能匹配 case 3,执行正确,但 default 放在前面,逻辑不清晰(新手容易误以为 default 是第一个匹配);

  • 正确示例

    java 复制代码
    switch (week) {
        case 3:
            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 是分支结构的两大核心工具,掌握它们后,程序的 "决策能力" 会大幅提升。

相关推荐
编程火箭车2 天前
【Java SE 基础学习打卡】24 循环结构 - while
java·编程基础·循环结构·while循环·java se·do-while循环·避免死循环
编程火箭车3 天前
【Java SE 基础学习打卡】22 分支结构 - if
java·流程控制·编程基础·if语句·分支结构·条件判断·新手避坑
熊猫_豆豆1 个月前
回调函数的作用与举例(Python版)
服务器·python·编程语法
BillKu3 个月前
Java核心概念详解:JVM、JRE、JDK、Java SE、Java EE (Jakarta EE)
java·jvm·jdk·java ee·jre·java se·jakarta ee
诸神缄默不语1 年前
Java SE 与 Java EE 简介
java·数据库·java-ee·java se
唐僧洗头爱飘柔95271 年前
【Java基础】正则表达式的使用与常用类分享
java·开发语言·正则表达式·java基础·pattern·java se·java必备技能
__lost1 年前
c++的虚继承说明、案例、代码
开发语言·c++·编程语法·c++知识
结衣结衣.1 年前
Python基础语法1
开发语言·笔记·python·学习·编程·编程语法
醉颜凉1 年前
Java 中的 switch 语句:类型支持与限制
java·开发语言·面试·职场和发展·switch·switch 语句·类型支持与限制