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将引起歧义。