合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
## [switch](https://lingcoder.gitee.io/onjava8/#/book/05-Control-Flow?id=switch) **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**是可选的。若省略**break,**会继续执行后面的**case**语句的代码,直到遇到一个**break**为止。通常我们不想出现这种情况,但对有经验的程序员来说,也许能够善加利用。注意最后的**default**语句没有**break**,因为执行流程已到了**break**的跳转目的地。当然,如果考虑到编程风格方面的原因,完全可以在**default**语句的末尾放置一个**break**,尽管它并没有任何实际的作用。 **switch**语句是一种实现多路选择的干净利落的一种方式(比如从一系列执行路径中挑选一个)。但它要求使用一个选择因子,并且必须是**int**或**char**那样的整数值。例如,假若将一个字串或者浮点数作为选择因子使用,那么它们在 switch 语句里是不会工作的。对于非整数类型(Java 7 以上版本中的 String 型除外),则必须使用一系列**if**语句。 在[下一章的结尾](https://lingcoder.gitee.io/onjava8/#/./06-Housekeeping?id=%e6%9e%9a%e4%b8%be%e7%b1%bb%e5%9e%8b)中,我们将会了解到**枚举类型**被用来搭配**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"); } } } } ~~~ 输出结果: ~~~ 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**的末尾,否则控制流程会继续往下执行,处理后面的**case**。在下面的语句中: ~~~ int c = rand.nextInt(26) + 'a'; ~~~ 此处`Random.nextInt()`将产生 0~25 之间的一个随机**int**值,它将被加到`a`上。这表示`a`将自动被转换为**int**以执行加法。为了把`c`当作字符打印,必须将其转型为**char**;否则,将会输出整数。