行业资讯 2025年08月6日
0 收藏 0 点赞 687 浏览 4597 个字
摘要 :

文章目录 switch 语句 语法 执行过程 代码演示 switch表达式 使用箭头语法返回值 yield带关键字的返回值 使用instanceof进行类型检查 处理null值 限制条件 Case标……




  • switch 语句
    • 语法
    • 执行过程
    • 代码演示
  • switch表达式
    • 使用箭头语法返回值
    • yield带关键字的返回值
    • 使用instanceof进行类型检查
    • 处理null值
  • 限制条件
    • Case标签值必须在数据类型范围内
    • 不允许重复的Case标签
  • 总结

在Java编程中,switch语句是一种用于多分支条件判断的结构。它允许您根据表达式的值在不同的分支中进行选择。本教程将详细介绍switch语句的语法、执行过程和各种应用情况,通过简单的代码案例来帮助初学者理解。

switch 语句

语法

switch语句的基本语法如下所示:

switch (expression) {
    case value1:
        // 代码块1
        break;
    case value2:
        // 代码块2
        break;
    // 更多 case 分支
    default:
        // 默认代码块
}

表达式值必须是以下 6 种类型之一:

  • 原始数据类型,例如、byte、和shortcharint
  • 包装类,例如、Character、和ByteShortInteger
  • 枚举类型(Java 5 中添加)
  • String类(Java 7中添加)

这里value1value2是“编译时常量表达式”或常量(标签的值必须在编译时已知)。

break语句用于结束当前case块的执行,防止继续执行后续的分支。

我们可以使用一系列if-else 块来实现类似的功能,但switch语句更具可读性和简洁性。

执行过程

switch语句被执行时,会按照以下步骤进行:

  1. 计算expression的值。
  2. 将该值与每个case后面的常量值进行比较,如果匹配则执行对应的代码块。
  3. 如果找到匹配的case,执行其代码块,并且在代码块的结尾遇到break语句时退出switch语句。
  4. 如果没有找到匹配的case,执行default代码块(如果存在)。

代码演示

在此示例中,我们使用switch语句检查今天是周末还是工作日。为了存储一周中的所有天,我们创建了一个枚举。

请注意我们如何创建总共八个返回适当true或false值的 case 标签。

传统的 switch 语句public class SwitchStatement
{
    public static void main(String[] args)
    {
        System.out.println(\"Monday is : \" + isWeekDay(Day.TUE));
        System.out.println(\"Monday is : \" + isWeekDay(Day.SUN));
    }
    public static Boolean isWeekDay(Day day)
    {
        Boolean result = false;
        switch(day) {
            case MON:
                result = true;
                break;
            case TUE:
                result = true;
                break;
            case WED:
                result = true;
                break;
            case THUR:
                result = true;
                break;
            case FRI:
                result = true;
                break;
            case SAT:
                result = false;
                break;
            case SUN:
                result = false;
                break;
            default:
                throw new IllegalArgumentException(\"Invalid day: \" + day.name())
        }
        return result;
    }
}
enum Day {
    MON, TUE, WED, THUR, FRI, SAT, SUN
}

上面的例子按预期工作,但我们可以做得更好。正如我们看到的,多个 case 标签返回相同的值,因此我们可以对 case 标签进行分组以使代码更具可读性。

第一个示例的更具可读性的版本public static Boolean isWeekDay(Day day)
{
    Boolean result = false;
    switch(day) {
        case MON, TUE, WED, THUR, FRI:
            result = true;
            break;
        case SAT, SUN:
            result = false;
            break;
        default:
            throw new IllegalArgumentException(\"Invalid day: \" + day.name())
    }
    return result;
}

仍有改进的机会。在上面的例子中,使用break语句看起来不太好。我们可以使用新的箭头语法删除break语句。它从Java 13开始可用。

public static Boolean isWeekDay(Day day)
{
    Boolean result = false;
    switch(day) {
        case MON, TUE, WED, THUR, FRI -> result = true;
        case SAT, SUN -> result = false;
        default -> throw new IllegalArgumentException(\"Invalid day: \" + day.name());
    }
    return result;
}

switch表达式

Java 12 引入了 switch 表达式,它可以计算整个 switch 语句的值并将其值分配给变量。它与其他普通的 Java 语句非常相似。

使用箭头语法返回值

Java 12引入了箭头语法(Arrow Case)来简化switch语句,使其可以在分支中返回值,而无需显式使用break

让我们用 switch 表达式重写最后一个示例。注意行号 11我们直接将 switch 语句的值赋给变量result。

public class SwitchStatement
{
    public static void main(String[] args)
    {
        System.out.println(\"Monday is : \" + isWeekDay(Day.TUE));
        System.out.println(\"Monday is : \" + isWeekDay(Day.SUN));
    }
    public static Boolean isWeekDay(Day day)
    {
         Boolean result = switch(day) {
            case MON, TUE, WED, THUR, FRI ->  true;
            case SAT, SUN -> false;
            default -> throw new IllegalArgumentException(\"Invalid day: \" + day.name());
        };
        return result;
    }
}
enum Day {
    MON, TUE, WED, THUR, FRI, SAT, SUN
}

yield带关键字的返回值

在Java 13中,引入了带有yield关键字的switch表达式,它允许在switch分支中直接返回值,类似于箭头语法。

在上面的示例中,我们只在 case 语句中写入返回值。如果我们必须在从给定 case 块返回任何值之前执行多个语句该怎么办?

在这种情况下,yield关键字有助于从多语句块返回计算值

在给定的示例中,我们只编写了一条打印语句。您可以根据需要编写任意数量的语句。

public static Boolean isWeekDay(Day day)
{
     Boolean result = switch(day) {
        case MON, TUE, WED, THUR, FRI ->  {
            System.out.println(\"It\'s Weekday\");
            yield true;
        }
        case SAT, SUN -> {
            System.out.println(\"It\'s Weekend\");
            yield false;
        }
        default -> throw new IllegalArgumentException(\"Invalid day: \" + day.name());
    };
    return result;
}

使用instanceof进行类型检查

在Java 17中,引入了对switch语句的增强功能,可以更方便地使用instanceof运算符来进行类型检查。这种用法可以取代传统的if-else链。例如:

传统上,如果我们必须编写一段代码来检查实例类型并执行一些逻辑,那么就是这样:

Object o;
if (o instanceof String)
{
    String s = (String) o;
    String.format(\"String %s\", s)
}
else if (o instanceof Integer)
{
    Integer i = (Integer) o;
    String.format(\"int %d\", i)
}
else if (o instanceof Double)
{
    Double d = (Double) o;
    String.format(\"double %f\", d)
}

在Java 17中,我们可以通过以下方式重写整个表达式;

Object o;
switch (o)
{
    case Integer i -> String.format(\"int %d\", i);
    case Double d  -> String.format(\"double %f\", d);
    case String s  -> String.format(\"String %s\", s);
    default        -> o.toString();
}

处理null值

在过去的Java版本中,switch语句无法直接处理null值。但是,在Java 14中,引入了新的switch表达式,可以使用null作为表达式。例如:

Java 17 之前:

if (s == null) {
    System.out.println(\"oops!\");
    return;
}
switch (s) {
    case \"Foo\", \"Bar\" -> System.out.println(\"Great\");
    default           -> System.out.println(\"Ok\");
}

在Java17中:

switch (s) {
    case null         -> System.out.println(\"Oops\");
    case \"Foo\", \"Bar\" -> System.out.println(\"Great\");
    default           -> System.out.println(\"Ok\");
}

限制条件

Case标签值必须在数据类型范围内

请注意,用作case标签的常量表达式的值必须在switch表达式的数据类型范围内。

在Java中,byte数据类型的范围是-128到127,因此以下代码将无法编译,因为第二个case标签为150,超出了byte数据类型的范围:

byte b = 10;
switch (b) {
        case 5:
                b++;
                break;
        case 150:       // 编译错误: 150 超过了 127
                b--;
                break;
        default:
                b = 0;
}

不允许重复的Case标签

另一个需要注意的重要点是,在switch语句中,两个case标签不能相同。以下代码片段将无法编译,因为重复出现了case标签10:

int num = 10;
switch (num) {
        case 10:
                num++;
                break;
        case 10: // 编译错误. 重复case label 10
                num--;
                break;
        default:
                num = 100;
}

总结

通过以上示例,您应该对Java中的switch语句有了更好的理解。它是一个强大的工具,用于处理多个分支条件,而不必编写冗长的if-else语句。随着Java版本的升级,switch语句也得到了许多增强和改进,使其更加灵活和实用。希望本教程能帮助您在编程中更好地使用switch语句。

归属教程 Java基础教程

文章目录 前言  第1章 Java语言基础 第2章 流程控制语句 第3章 面向对象编程 第4章 Java 字符 […]

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/9070.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

986
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

463
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

347
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

455
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

516
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

831
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号