Java开发手册
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

4.3 switch语句

前面介绍了if语句,其可以通过嵌套使用实现多分支。其实Java中实现多分支还有一个选择,就是使用switch多分支语句。switch语句比if要复杂得多,本节和4.4 节将具体介绍switch的基本语法、合法的判断表达式、合法的case表达式以及详细执行流程等内容。

4.3.1 switch判断语法

switch多分支语句的基本语法如下:

    switch(<判断表达式>)
    {
        case表达式a:
        判断表达式值与表达式a值相匹配时所执行的代码序列
        break;
        case表达式b:
        判断表达式值与表达式b值相匹配时所执行的代码序列
        break;
        ……
        default:
        判断表达式值与所有case都不匹配时所执行的代码序列
    }

其中,default分支为可选部分,在不需要时可以没有,其执行流程如图4-5所示。

图4-5 switch执行流程

表4.1给出了各个编号所表示的内容。

表4.1 内容编号对照表

下面的程序说明了switch语句的基本使用情况。

    1   //代码实现
    2   public class Sample4_1
    3   {
    4        public static void main(String args[])
    5        {
    6            int i=3;
    7            switch(i){
    8                case 1:
    9                System.out.println("这是1");           //打印
    10               break;
    11               case 2:
    12               System.out.println("这是2");           //打印
    13               break;
    14               case 3:
    15               System.out.println("这是3");           //打印
    16               break;
    17               default:
    18               System.out.println("1,2,3都不是");    //打印
    19               break;
    20           }
    21       }
    22  }

编译运行如上程序,其运行结果如图4-6所示。

图4-6 Sample4_1的编译运行结果

例Sample4_1中switch语句的执行流程如图4-7所示。

图4-7 Sample4_1中switch语句的执行流程

提示:switch只能用于检查相等的情况,其他诸如大于等关系switch语句无法处理。

4.3.2 判断表达式

switch语句圆括号中的表达式并不是任何类型的都可以,其需要满足一些要求,主要分两个方面:

· 基本类型表达式。

· 枚举类型表达式。

1.基本类型表达式

如果是基本类型的表达式,则要求其返回值类型必须是int兼容型的。也就是说,表达式的类型只能是byte、short、char以及int四种(其中byte、short、char可以自动提升转换为int型),否则将编译失败。例如,将例Sample4_1第7行圆括号中的表达式改为赋值表达式,改动后代码如下。

    switch(i=2){

改动后,赋值表达式的返回值为int型的2,将代码编译运行,其结果如图4-8所示。

图4-8 Sample4_1改后的编译运行结果

2.枚举类型表达式

从JavaSE 5.0开始,判断表达式不但可以是int兼容型的,而且还允许是枚举类型的。下面的程序说明了这个问题。

    1   //代码实现
    2   //声明枚举类型LightColor,其有三种选择:red、yellow与green。
    3   enum LightColor {red,yellow,green}
    4   public class Sample4_2
    5   {
    6        public static void main(String args[])
    7        {
    8            //声明枚举类型变量lc,并设定其初值为LightColor.red
    9            LightColor lc=LightColor.red;
    10           //对switch使用枚举类型
    11           switch(lc)
    12           {
    13               case red:
    14                 System.out.println("亮红灯");
    15               break;
    16               case yellow:
    17                 System.out.println("亮黄灯");
    18               break;
    19               case green:
    20                 System.out.println("亮绿灯");
    21               break;
    22           }
    23       }
    24  }

提示:switch中每个case后面的枚举类型值不能加上前缀“LightColor.”,否则编译不通过。因为系统会自动从lc变量的类型知道是哪种枚举类型的,不需要再编写代码指出。

编译运行如上代码,其结果如图4-9所示。

图4-9 Sample4_2的运行结果

从图4-9中可以看出,因为变量lc的值为red,所以执行结果打印了“亮红灯”的信息。

4.3.3 case表达式

case后面所跟的表达式也是要满足一定要求的,其分三个方面:

· 与判断表达式的匹配。

· 自身是常量。

· 不能有两个相同的case。

1.与判断表达式的匹配

所谓“与判断表达式的匹配”是指case后面的表达式必须与switch圆括号中的表达式具有相同的类型,例如:

    1   byte b=2;
    2   switch(b)
    3   {
    4        case 2:
    5        System.out.println("这是2");  //打印
    6        break;
    7        case 128:                     //此行编译将报错
    8        System.out.println("这是128");//打印
    9        break;
    10  }

上述代码将编译失败,因为switch圆括号中的参数b为byte型,而第7行case后所跟的字面常量超出了byte的范围。这其实是Java系统聪明的表现,因为变量b是byte型的,其不可能有值128,那128这个case就没有任何意义,所以报错。

2.自身是常量

case后的表达式还有一项约束,那就是此表达式必须是常量,其值是在编译时就可以确定的,而不需要等到运行时。那么这个表达式只能由字面常量与final的变量组成,当然也可以只有其中一种,例如:

    1   final int a=2;
    2   int b=3;
    3   int i=0
    4   switch(i)
    5   {
    6        case 3+3:
    7            System.out.println("3+3…");
    8        break;
    9        case a+3:
    10           System.out.println("a+3…");
    11       break;
    12       case b:
    13           System.out.println("b…");
    14       break;
    15  }

· final表示此变量为最终的,在这里可以理解为声明了一个常量。

· “case 3+3:”编译通过。

· “case a+3:”编译通过。

· “case b:”编译报错,因为b不是final的变量。

3.不能有两个相同的case

另外,switch语句中的不同case不能使用相同的匹配值,否则将编译报错,例如:

    1   int i=1;
    2   switch(i)
    3   {
    4        case 1:
    5            System.out.println("1…");
    6        break;
    7        case 1:
    8            System.out.println("1…");
    9        break;
    10  }

说明:匹配值为1的case已经有了,故编译报错。这从逻辑上是严密的,因为两个相同的case将引起歧义。