Java switch case 语句用于判断一个表达式的结果与一系列中的某个值是否相等,如果相等则执行一些语句。
一系列中的每个值都是一个 case
分支。
语法
Java switch case 语句的语法格式一般如下
switch(expression){ case value1 : // 值 1 //如果 expression 和 value1 匹配则执行这个语句 break; //可选 case value2 : // 值 2 //语句 break; // 可选 //其它可以有任意数量的case语句 default : //如果都不匹配,则执行这个分支 可选 //语句 }
从这个语法格式中可以看到, Java switch case 语句和五个单词息息相关: switch
、case
、:
、break
、expression
-
switch
和expression
:switch
翻译成中文是开关的意思,因此switch(expression)
可以理解为expression
这个开关。而expression
是一个表达式,一个表达式就是一条有返回值的语句。 -
case
和冒号:
:case
翻译成中文有 "事例” 、"例" 的意思,因此case value1
可以理解为如果为value1
这个事例,其实也就是说如果等于value1
的话。冒号
:
一般用于提起下文 ( 坑爹的中文 ),在任何语言中,冒号的作用就是如果冒号之前的表达式为真,则运行冒号之后的语句。 -
break
翻译成中文有打断的意思。而在switch case
语句中的意思是打断整个switch case
语句,也就是不继续执行switch
语句。注意: 在 Java 语法中,
break
语句总是用于打断和它匹配的关键字语句的执行,在switch
语句中,这个匹配的关键字就是switch
语句。 -
default
是默认的意思,这个关键字后面没有任何可选的值,只有一个冒号:
。表示如果上面的case
语句都没有匹配到,那么就执行这个语句。
switch case 语句的运行流程
了解了 Java switch case 语句的语法,了解了 switch case 语句中每个关键字的作用,那么,要理解 Java switch case 语句的流程就很简单了。
-
当执行流程遇到 switch 关键字时,首先会计算 expression 表达式的值。Java 中的表达式有三种情况
- expression 可以是一个常量或者变量,类型只能是基础类型,例如
byte
、short
、int
、char
和String
(Java 7 新增了字符串类型 String )。不能是其它类类型或者自定义类型。 - expression 可以是一个简单的运算,比如
1+2
或2+3
,但是,运算的结果必须是上面所说的基本类型。 - expression 可以是一个方法调用,比如
add(1,2)
,但方法的返回值必须是上面提到的基本类型。
- expression 可以是一个常量或者变量,类型只能是基础类型,例如
-
计算完
expression
表达式的结果后,就会与每个case
关键字后面的value
匹配,如果匹配成功,则运行case
语句冒号后面的所有语句。这里有几个点非常重要:-
每个 switch case 语句可以有多个 case 分支,分支数量不限。每个 case 后面跟一个要比较的值和冒号
-
value1
、value2
、value3
几个必须是一个变量或者常量或者字面量,不能是运算操作或者方法调用。也就是说它们必须是一个实实在在的值,比如2
、简单教程
等。 -
匹配时除了匹配值外, 还会比较它们的数据类型,数据类型不同,也不会匹配,比如,如果
expression
表达式的返回结果是字符串'1'
,而 case 语句为case 1:
,那么也不会匹配,因为数据类型不同。 -
还有一点,也是最重要的一点,一旦某个
case
语句被匹配上,那么之后所有的case
语句 ( 包括default
语句 ) 都会被执行 ( 也就是忽略匹配 ),直到遇到break
语句。这条规则很反人类,因为我们的固定思维,就是一个
case
对应一个匹配,如果匹配不成功,则不执行,但实际上并不是这样的,而是一旦匹配,之后所有的case
语句都被执行。 -
如果流程继续的过程中遇到
break
语句,则会终止switch
语句的执行,也就是说break
语句之后的所有switch
其它语句都不会执行了。break
语句并不是必须的,case
语句里可以有break
,也可以没有break
。 -
switch case 语句还可以包含一个可选的
default
语句 ( default 分支 )。当任何一个 case 语句都不匹配时,才会执行 default 分支。default 语句可以位于任何位置,可以位于两个 case 语句之间,可以有,也可以没有
break
语句。 但要注意的是,default
的执行时机,是没有任何case
语句匹配才执行。
-
我们总结一下:
-
Java switch case 语句是一个顺序执行语句,会先计算 expression 表达式的值,并且按照顺序与每一个 case 语句匹配,如果匹配不成功,则不运行 case 冒号之后的语句。如果匹配成功,则会执行匹配的 case 语句,并且会导致剩余的所有 case 语句都匹配成功。
-
因为一旦匹配成功,剩余的所有 case 语句都会匹配成功,有时候,可能需要在某个时刻中断
switch
语句,这时候就需要break
语句了,在break
语句后的所有 switch 语句都不会执行。 -
如果没有 case 语句匹配到,那么就会查找 switch 中的 default 语句,一旦找到,则执行
default
语句。注意: default 语句与 case 语句的顺序很重要,如果没有任何一个 case 被匹配,而
default
语句又没有break
,那么后续所有的 case 语句也会执行。
范例
在当前目录下,创建一个文件 SwitchCaseTester.java
,本章接下来所有的范例,我们都会在这个文件中完成。
1. 正常的使用,每个 case 分支都有一个 break 语句
public class SwitchCaseTester { public static void main(String args[]) { char grade = 'B'; System.out.println("你的等级是 " + grade); switch(grade) { case 'S': System.out.println("完美"); break; case 'A' : System.out.println("优秀"); break; case 'B' : System.out.println("良好"); break; case 'C' : System.out.println("及格"); break; case 'F' : System.out.println("不及格"); break; default : System.out.println("未知等级"); } } }
编译运行以上范例,输出结果如下
[yufei@www.twle.cn java]$ javac SwitchCaseTester.java && java SwitchCaseTester 你的等级是 B 良好
2. 如果要将 'B',也改为优秀
最简单的方法就是就是把 'B' 中的输出语句改成优秀
public class SwitchCaseTester { public static void main(String args[]) { char grade = 'B'; System.out.println("你的等级是 " + grade); switch(grade) { case 'S': System.out.println("完美"); break; case 'A' : System.out.println("优秀"); break; case 'B' : System.out.println("优秀"); break; case 'C' : System.out.println("及格"); break; case 'F' : System.out.println("不及格"); break; default : System.out.println("未知等级"); } } }
编译运行以上范例,输出结果如下
[yufei@www.twle.cn java]$ javac SwitchCaseTester.java && java SwitchCaseTester 你的等级是 B 优秀
而最 switch case 的做法,就是删掉 'A' 里面的语句,并把 'B' 的输出改成优秀
public class SwitchCaseTester { public static void main(String args[]) { char grade = 'B'; System.out.println("你的等级是 " + grade); switch(grade) { case 'S': System.out.println("完美"); break; case 'A' : case 'B' : System.out.println("优秀"); break; case 'C' : System.out.println("及格"); break; case 'F' : System.out.println("不及格"); break; default : System.out.println("未知等级"); } } }
编译运行以上范例,输出结果如下
[yufei@www.twle.cn java]$ javac SwitchCaseTester.java && java SwitchCaseTester 你的等级是 B 优秀
3. 如果没有任何一个 case 被匹配,则会运行 default 分支
我们把上面的范例中的 grade
改成 G
public class SwitchCaseTester { public static void main(String args[]) { char grade = 'G'; System.out.println("你的等级是 " + grade); switch(grade) { case 'S': System.out.println("完美"); break; case 'A' : case 'B' : System.out.println("优秀"); break; case 'C' : System.out.println("及格"); break; case 'F' : System.out.println("不及格"); break; default : System.out.println("未知等级"); } } }
编译运行以上范例,输出结果如下
[yufei@www.twle.cn java]$ javac SwitchCaseTester.java && java SwitchCaseTester 你的等级是 G 未知等级
4. 如果成功匹配的 case 没有 break 语句,那么它会一直执行,直到遇到 break
语句
我们再改改第一个范例,把 case B
中的 break
语句删掉
public class SwitchCaseTester { public static void main(String args[]) { char grade = 'B'; System.out.println("你的等级是 " + grade); switch(grade) { case 'S': System.out.println("完美"); break; case 'A' : System.out.println("优秀"); break; case 'B' : System.out.println("良好"); case 'C' : System.out.println("及格"); break; case 'F' : System.out.println("不及格"); break; default : System.out.println("未知等级"); } } }
编译运行以上范例,输出结果如下
[yufei@www.twle.cn java]$ javac SwitchCaseTester.java && java SwitchCaseTester 你的等级是 B 良好 及格
从运行结果中可以看到,因为 grade
是 'B'
,所以 case 'B'
被匹配,输出结果 良好
。但因为 case 'B'
中并没有 break
语句,所以会继续执行下一个 case
语句而忽略是否匹配,也就是执行 case C
,输出 及格
,因为 case 'C'
中有 break
语句,所以跳出了 break
语句,那么后面的 case 'F'
并没有得到执行。