【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 是分支结构的两大核心工具,掌握它们后,程序的 "决策能力" 会大幅提升。

相关推荐
编程火箭车4 天前
【Java SE 基础学习打卡】36 数组的常见操作
冒泡排序·java se·java 基础·线性查找·数组常见操作·数组增删改·数组拷贝
编程火箭车5 天前
【Java SE 基础学习打卡】35 数组元素的访问与遍历
数组索引·java se·java 基础·java 数组·数组元素访问与遍历·普通 for 循环·增强 for 循环
编程火箭车9 天前
【Java SE 基础学习打卡】34 数组的定义与初始化
java se·java 基础·java 数组·数组定义与初始化·静态初始化·动态初始化·length 属性
编程火箭车10 天前
【Java SE 基础学习打卡】33 数组的概述
java se·java 基础·数组概述·数组核心特征·java 数组·批量存储数据·连续内存存储
编程火箭车11 天前
【Java SE 基础学习打卡】32 方法的嵌套调用与递归调用
java se·java 基础·java 方法·方法嵌套调用·方法递归调用·递归终止条件·递归应用场景
编程火箭车11 天前
【Java SE 基础学习打卡】31 方法的返回值与void关键字
java se·java 基础·return 语句·编程小白入门·java 方法·方法返回值·void 关键字
编程火箭车14 天前
【Java SE 基础学习打卡】28 方法的定义与调用
java se·参数传递·返回值·java 基础·新手避坑·java 方法·方法定义与调用
编程火箭车1 个月前
【Java SE 基础学习打卡】27 方法的概述
编程语法·java se·代码复用·编程小白入门·方法概述·功能模块化·java 方法
编程火箭车2 个月前
【Java SE 基础学习打卡】24 循环结构 - while
java·编程基础·循环结构·while循环·java se·do-while循环·避免死循环