《Oracle Java SE编程指南》08-03:switch语句

课程封面-JavaSE-AT阿宝哥

内容导航

  • 前言
  • 1、定义
  • 2、示例
  • 3、String

前言

判断是使用if-then-else语句还是switch语句取决于可读性和语句的表达式。if-then-else语句可以基于值或条件范围测试表达式,而switch语句仅基于单个整数、枚举值或字符串对象测试表达式。


1、定义

与if-then和if-then-else语句不同,switch语句可以有许多可能的执行路径。语法格式为:


switch (表达式)
{
  case 取值1:语句块1

  …

  case 取值n:语句块n

  default: 语句块n+1

}


语法分析:

  • 表达式
    switch语句使用()分隔符定义一个条件表达式,且表达式的值可以是byteshortcharint 原始数据类型,它还可以是Enum枚举类型、String字符串类型和一些包装某些基本类型的特殊类:Byte、Short、Character和Integer。除此之外,不接受其他类型的值。

  • switch块
    switch语句使用{}分隔符定义其主体,被称为switch块。switch块中的语句块可以使用至少一个或多个case或最多一个default标签进行标记。

  • case值匹配
    switch语句在执行时,先计算它的表达式得到一个结果值,然后按书写顺序和case标签后面的值进行匹配,一旦第一次匹配成功,控制流就会跳转到这个case标签位置,开始顺序执行其后所有的语句,而不管后续case取值是否匹配,包括default标签后面的语句,直到碰到break语句为止。注意,case标签后的取值不允许有重复的。

  • break语句
    break语句用来终止switch语句,控制流继续执行switch块后面的第一个语句。从技术上讲,最后的break语句不是必需的,因为,控制流不属于switch的范畴。但是,从算法上讲,break语句是必需的,因为没有它们,switch块中的语句就会失控。

  • default标签
    当没有匹配到case标签后面的值时,执行default标签后面的语句。default标签在switch块中的位置不影响上述规则,但是一般情况下,建议写在最后。

另外,如果在casedefault标签的语句数量比较多的话,可以使用分隔符{}对其显式分组。


2、示例

下面的示例代码声明了一个名为week的int类型变量,它的值表示某一天。代码使用switch语句根据week的值显示星期的名称。

示例代码:


public class Demo01 {

    public static void main(String[] args) {

        int week = 2;

        switch (week) {
            default:
                System.out.println("Sorry,I don't know");
                System.out.println("对不起,我不知道!");
                break;
            case 1:
                System.out.println("Monday");
                System.out.println("星期一");
                break;
            case 2:
                System.out.println("Tuesday");
                System.out.println("星期二");
                break;
            case 3:
                System.out.println("Wednesday");
                System.out.println("星期一");
                break;  
        }
    }
}

运行结果:


Tuesday
星期二


3、String

在Java SE 7及以后的版本中,我们可以在switch语句的表达式中使用String对象。下面的示例代码根据名为week的字符串的值显示星期。

示例代码:


public class Demo02 {
    
    public static void main(String[] args) {
        String week = "W";
        
        if (week == null) {
            week = "";
        }
        
        switch (week.toLowerCase()) {
            case "m":
                System.out.println("Monday");
                System.out.println("星期一");
                break;
            case "t":
                System.out.println("Tuesday");
                System.out.println("星期二");
                break;
            case "w":
                System.out.println("Wednesday");
                System.out.println("星期三");
                break;
            default:
                System.out.println("Sorry,I don't know!");
                System.out.println("对不起,我不知道!");
        }
    }
}

运行结果:


Wednesday
星期三

Switch表达式中的字符串结果与每个case标签相关联的表达式的结果进行比较,隐式使用了equals方法。为了使示例可以接受任意星期而不考虑大小写,week被使用了toLowerCase方法转换为小写,并且关联标签的所有字符串都是小写的。

另外,我们提前检查了week对象是否为null,以确保任何switch语句中的表达式的计算结果都不是null,以防止抛出NullPointerException。


持续更新,欢迎留言提议!
码字很累,多点赞多赞赏!


扫描二维码,关注AT阿宝哥

你可能感兴趣的:(《Oracle Java SE编程指南》08-03:switch语句)