switch 有时也叫作选择语句。根据整数表达式的值,switch 语句从多个代码片段中选择一个去执行。通常它的格式如下:

    1. switch(integral-selector) {
    2. case integral-value1 : statement; break;
    3. case integral-value2 : statement; break;
    4. case integral-value3 : statement; break;
    5. case integral-value4 : statement; break;
    6. case integral-value5 : statement; break;
    7. // ...
    8. default: statement;
    9. }

    其中,整数选择器(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,否则将输出整数值。