3.5 switch语句
Java的第二个选择语句是switch语句。switch语句提供了多个分支。于是,它使程序可以在多个选项中做出选择。尽管一系列嵌套的if语句可以执行多路测试,在许多情况下,switch语句是更有效的方法。它像这样工作:表达式的值与一系列的常数比较。当找到一个选项时,执行与这个匹配项相关的语句序列。switch语句的一般形式为:
对于JDK 7以前的Java版本,控制switch的表达式expression必须是byte、short、int、char或枚举类型。(枚举类型在第13章介绍。)从JDK 7开始,表达式expression也可以是String类型。这意味着,Java的最新版本可以用字符串控制switch。(这个技术将在第5章描述String时介绍。)通常的情况是,控制switch的表达式仅仅是一个变量,而不是一个较大的表达式。
case语句指定的每个值都必须是一个常表达式(例如,字面量)。不允许出现相同的case选项。每个值的类型必须与控制表达式中的类型兼容。
如果没有case常量匹配表达式,就执行default语句对应的序列。default语句是可选的。如果没有出现default语句,且所有选项都不匹配,就不执行任何语句。如果找到一个匹配项,就执行与那个case相关的语句。直到出现break。对于case语句和default语句,会一直运行到switch语句才结束。
下面程序演示了switch的用法。
程序产生的输出如下所示:
可以看到,每次循环时,执行与变量i匹配的case常数相关的语句。其他语句不执行。当变量i大于等于5时,没有匹配的case语句,所以执行default语句。
从技术上说,break语句是可选的,尽管大多数的switch语句都会使用它。当在case的一系列语句序列中遇到break时,break语句使程序流从整个switch语句中退出,从switch外的下一个语句开始执行。但是,如果与case相关的语句序列没有以break结尾,那么当前case和之后case的所有语句都会执行,直到遇到break或switch结束。
例如,仔细学习以下程序。你能在看到输出前指出屏幕上会显示什么吗?
程序显示以下输出:
这个程序显示,如果没有出现break语句,就会继续执行下一个case语句。
还有空的case语句,如下面这个例子:
在这个程序片段中,如果变量i的值为1、2、3,就执行第一个println()语句。如果变量i的值是4,执行第二个println()语句。在这个例子中,case语句的省略在多个case子句共享代码时是很常见的。