很多编程语言都支持switch语句,以便快速在多个分支中选择某一个,Java也不例外,同样支持该语句,但是与其他的编程语言不大一样,它有自己的特色。
1. 常规switch语句
最常见的使用方式是各种case+break组合,如下所示:
public static void main(String[] args)
{
Scanner s = new Scanner(System.in);
int x = s.nextInt();
switch (x)
{
case 0:
System.out.println("Zero");
break;
case 1:
System.out.println("One");
break;
case 2:
System.out.println("Two");
break;
}
}
这样,输入1,就会回显One,Java和C#在switch中第一个不同就是,C#不允许case中不加break,而Java中如果不加break,就会出现直通(fall-through)的现象,即输入1,会显示One和Two这两行;另外就是default,和一般的C语言中没什么两样,就是没有命中任何一个分支的操作。这些都是老生常谈,就不再细说了。
其实,知道这个,就可以“一招鲜,吃遍天”了,但是其他几个语法特点,还是值得我们去了解一下的。
2. 无直通行为
Java对switch的第一个扩展是,可以使用->替换case后面的冒号,这样,即使不加break,它也不会产生直通行为,代码如下:
public static void main(String[] args)
{
Scanner s = new Scanner(System.in);
int x = s.nextInt();
switch (x)
{
case 0->
System.out.println("Zero");
case 1->
System.out.println("One");
case 2->
System.out.println("Two");
}
}
上面的代码中,输入0只会显示Zero,而不会出现直通现象,使用->需要注意如下两点:
1. 不能混合使用->和: ,否则产生语法错误;
2. 不要画蛇添足的在case的最后一条语句中加上break,同样会产生语法错误。
3. switch表达式
switch还能构成语句,在不同的分支下返回一个值,这通常是和yield搭配使用的,代码如下:
public static void main(String[] args)
{
Scanner s = new Scanner(System.in);
int x = s.nextInt();
String str;
str=switch (x)
{
case 0:
yield "Zero";
case 1:
yield "One";
case 2:
yield "Two";
default:
yield "Unknown";
};
System.out.println(str);
}
使用的时候要注意,switch有两个位置务必书写完整:
1. 必须所有的分支都有返回值(或者抛出异常),因此通常必须要有default语句;
2.switch语句的花括号后面,要添加分号(;)。
另外,上面的代码输入0也就显示Zero,看起来是没有直通行为的,实际上,这种方式也是支持直通行为的,如果前面的一个分支上没有yield值,则会继续直通下去,如下:
public static void main(String[] args)
{
Scanner s = new Scanner(System.in);
int x = s.nextInt();
String str;
str=switch (x)
{
case 0:
System.out.println(0+"");
case 1:
System.out.println(1+"");
yield "One";
case 2:
System.out.println(2+"");
yield "Two";
default:
System.out.println("Unknown");
yield "Unknown";
};
System.out.println(str);
}
输入0的结果是,打印0,1以及One三行。因为case 0中没有返回值,因此并不会返回值给str,代码会继续执行到case 1中,当然这里仅为了阐述这一现象,实际使用时,强烈不建议这么做。
4. 省略yield的switch表达式
有时候switch语句返回值很简单,可以这样写:
public static void main(String[] args)
{
Scanner s = new Scanner(System.in);
int x = s.nextInt();
String str;
str=switch (x)
{
case 0-> "Zero";
case 1-> "One";
case 2-> "Two";
default-> "Unknown";
};
System.out.println(str);
}
即在箭头符号后面直接跟着写需要返回的值即可,当然,如果无法做到这一点,可以结合使用yield语句。
最后,总结一下几个特点:
A:关于直通现象
1. 使用冒号(:),没有break的话就会直通;
2. 使用箭头(->),没有返回值的分支就会产生直通;
B:关于表达式
1. 表达式可以使用冒号和箭头方式,但是所有的分支必须要有返回值;
2. 不能在switch表达式中使用return、break及continue语句。