switch 有时也叫作选择语句。根据整数表达式的值,switch 语句从多个代码片段中选择一个去执行。通常它的格式如下:
switch(integral-selector) {
case integral-value1 : statement; break;
case integral-value2 : statement; break;
case integral-value3 : statement; break;
case integral-value4 : statement; break;
case integral-value5 : statement; break;
// ...
default: statement;
}
其中,整数选择器(integral-selector)是一个能生成整数值的表达式,switch 将这个表达式的结果与每个整数值(integral-value)相比较。如果发现相等,就执行对应的语句(单条语句或多条语句,不要求使用花括号包围)。若没有发现相等,就执行默认(default)语句。
注意上面的定义里每个 case 都用一个 break 结尾,它会让执行流程跳到 switch 主体的末尾。示例展示的是创建 switch 语句的常规方式,但 break 是可选的。如果省略,后面的 case 语句也会被执行,直到遇到一个 break。尽管你通常不会想要这种行为,但对有经验的程序员来说这可能会有用处。注意最后的 default 语句里没有 break,这是因为 default 语句执行完的地方,本来就是 break 跳转的目的地。如果觉得对编程风格而言这很重要,你可以在 default 语句的末尾放置一个 break ,这不会有任何影响。
switch 语句是一种实现多路选择(即从多个不同执行路径中挑选)的干净简洁的方式。但在Java 7 之前,它的选择器执行结果必须是整数值,比如 int 或 char。对非整数类型(在 Java 7 及之后的版本中,字符串也可以用作选择器),你只能使用一系列的 if 语句。在下一章的末尾,你会了解到 enum 能帮忙缓解这种限制,因为 enum 可以轻松地和 switch 结合使用。
下面这个例子会随机生成英文字母,并判断它们是元音还是辅音:
// control/VowelsAndConsonants.java
// 展示switch语句
import java.util.*;
public class VowelsAndConsonants {
public static void main(String[] args) {
Random rand = new Random(47);
for(int i = 0; i < 100; i++) {
int c = rand.nextInt(26) + 'a';
System.out.print((char)c + ", " + c + ": ");
switch(c) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u': System.out.println("vowel");
break;
case 'y':
case 'w': System.out.println("Sometimes vowel");
break;
default: System.out.println("consonant");
}
}
}
}
/* 输出(前13行):
y, 121: Sometimes vowel
n, 110: consonant
z, 122: consonant
b, 98: consonant
r, 114: consonant
n, 110: consonant
y, 121: Sometimes vowel
g, 103: consonant
c, 99: consonant
f, 102: consonant
o, 111: vowel
w, 119: Sometimes vowel
z, 122: consonant
...
*/
Random.nextInt(26) 会产生一个 0~25 范围内的值,所以你只需要加上一个偏移量 a,就能生成小写字母。在 case 语句中,使用单引号包围的字符也能生成用于比较的整数值。
注意这些 case 语句是怎么 “堆叠” 在一起,从而为一段特定代码形成多重匹配的。将 break 语句置于这段特殊代码的末尾十分重要,否则控制流程就会直接下移,继续执行后面的 case 语句。
在以下语句中:int c = rand.nextInt(26) + 'a';
Random.nextInt() 产生了一个 0~25 范围内的随机 int 值,然后和 a 的值相加。这表示 a 会自动转换为 int,以执行加法操作。
如果想把 c 当作字符来打印,则必须将它转型为 char,否则将输出整数值。