Java switch case语句的用法(非常详细)
Java 中的 switch-case 语句和 if-else 语句类似,称为分支语句,是另外一种可以实现多重分支结构的语句。
switch-case 语句的具体语法结构如下:

图 1 switch-case语句处理流程图
switch 语句中表达式的数据类型可以是 byte、short、char、int 以及其包装类,也可以是 Enum 枚举类,JDK 7 之后还可以是 String 类型。
尽管 switch 语句中表达式扩充了多种数据类型,但是其底层只支持 4 种基本数据类型,其他数据类型都是经过了间接的转换。
switch 语句在执行时,会首先计算表达式的结果,将计算结果与第 1 个 case 后的值 1 做比对,如果比对结果相等则执行该 case 后的语句块 1,如果比对结果不一样则继续和第 2 个 case 后的值 2 做比对,以此类推,如果所有 case 后的值都不匹配则执行 default 后的语句块。
需要注意,case 只是提供 switch 语句匹配成功后的执行入口,case 后的语句块并没有“{}”来标注整体,因此程序执行时并不知道何时该语句块执行完毕。如果匹配上某个 case 后的值,则会从该 case 分支后的语句块一直执行下去,如果没有 break 语句,则后续的 case 分支的语句块也将会执行,直到碰到 break 语句。
综上所述,switch 语句和 else-if 语句的不同之处在于,else-if 的判断条件可以是等值判断,也可以是其他复杂的条件判断,而 switch 只能做等值判断,并且语法结构上来看 switch 语句更简练,表达更清晰。
【实例】输入当前是周几,如果是周一、周三、周五则输出“今天学习”,如果是周二、周四、周六则输出“今天打球”,如果是周日则输出“看电影去,放松一下”,如果都不是则输出“输入错误”。
再次运行程序,输入“周二”,运行结果如下:
再次运行程序,输入“星期三”,运行结果如下:
第 9 行 switch 后的表达式返回的是一个字符串,会和 { } 中的 case 后的值进行逐一比对。
首先与第 10 行的第 1 个 case 后的值做比对:
再次运行程序,当第 3 次录入“星期三”时,也将会依次和各个 case 后的值进行比对,很明显都不匹配,最终执行了 default 后的代码,即输出“输入错误”。
对比 3 次执行结果,发现输入不同的值会有不同结果,switch 会从 case 中选择一个进行执行,如果都不匹配将执行 default 子句后的代码。
在以上案例中,我们可以发现多个 case 语句后的执行语句其实是一样的,即周一、周三、周五输出的都是“今天学习”,周二、周四、周六输出的都是“今天打球”。我们知道 switch 语句中如果某个 case 后的值匹配成功,将会从该 case 后的语句块起一直执行下去,直到遇到 break 语句,因此可以根据这一特点对以上案例进行优化:
再次运行程序,输入“星期三”,运行结果如下:
第 2 次输入“星期三”,与所有 case 后的值都不匹配,将执行 default 子句后的代码。
在此需要注意,default 子句的书写并不一定在所有 case 的后面,它只要在 switch 语句中即可,可以在所有 case 前,也可以在最后,也可以穿插在 case 中间。
调整上面实例中 default 子句的位置,将其放到“周四”之前,代码如下:
因此,即使 default 不在最后,同样需要添加 break 语句。修改代码如下:
switch-case 语句的具体语法结构如下:
switch (表达式) { case 值1: 语句块1; [break;] case 值2: 语句块2; [break;] case 值3: 语句块3; [break;] … case 值n: 语句块n; [break;] default: 语句块; }switch-case 语句的执行流程如下图所示:

图 1 switch-case语句处理流程图
switch 语句中表达式的数据类型可以是 byte、short、char、int 以及其包装类,也可以是 Enum 枚举类,JDK 7 之后还可以是 String 类型。
尽管 switch 语句中表达式扩充了多种数据类型,但是其底层只支持 4 种基本数据类型,其他数据类型都是经过了间接的转换。
switch 语句在执行时,会首先计算表达式的结果,将计算结果与第 1 个 case 后的值 1 做比对,如果比对结果相等则执行该 case 后的语句块 1,如果比对结果不一样则继续和第 2 个 case 后的值 2 做比对,以此类推,如果所有 case 后的值都不匹配则执行 default 后的语句块。
需要注意,case 只是提供 switch 语句匹配成功后的执行入口,case 后的语句块并没有“{}”来标注整体,因此程序执行时并不知道何时该语句块执行完毕。如果匹配上某个 case 后的值,则会从该 case 分支后的语句块一直执行下去,如果没有 break 语句,则后续的 case 分支的语句块也将会执行,直到碰到 break 语句。
综上所述,switch 语句和 else-if 语句的不同之处在于,else-if 的判断条件可以是等值判断,也可以是其他复杂的条件判断,而 switch 只能做等值判断,并且语法结构上来看 switch 语句更简练,表达更清晰。
【实例】输入当前是周几,如果是周一、周三、周五则输出“今天学习”,如果是周二、周四、周六则输出“今天打球”,如果是周日则输出“看电影去,放松一下”,如果都不是则输出“输入错误”。
import java.util.Scanner; public class Demo { public static void main(String[] args) { Scanner sca = new Scanner(System.in); System.out.println("------请输入今天周几------"); String week = sca.next(); switch (week) { case "周一": System.out.println("今天学习"); break; case "周二": System.out.println("今天打球"); break; case "周三": System.out.println("今天学习"); break; case "周四": System.out.println("今天打球"); break; case "周五": System.out.println("今天学习"); break; case "周六": System.out.println("今天打球"); break; case "周日": System.out.println("看电影去,放松一下"); break; default: System.out.println("输入错误"); } System.out.println("switch执行完毕"); } }运行程序,输入“周三”,运行结果如下:
-------请输入今天周几---------
周三
今天学习
switch执行完毕
再次运行程序,输入“周二”,运行结果如下:
-------请输入今天周几---------
周二
今天打球
switch执行完毕
再次运行程序,输入“星期三”,运行结果如下:
-------请输入今天周几---------
星期三
输入错误
switch执行完毕
第 9 行 switch 后的表达式返回的是一个字符串,会和 { } 中的 case 后的值进行逐一比对。
首先与第 10 行的第 1 个 case 后的值做比对:
- 第 1 次运行录入的是周三,明显“周一”不等于“周三”,因此第一个 case 后的代码块不会执行;
- 再比对第 12 行的 case 后的值,结果仍然不相等,因此该 case 后的代码块也不执行;
- 再比对第 14 行的 case 后的值,此时等值匹配,结果为 true,将会从该 case 后的代码块开始执行,输出“今天学习”,输出后有一个 break 语句,因此 switch 语句将运行结束,运行后续代码,即输出“switch执行完毕”。
再次运行程序,当第 3 次录入“星期三”时,也将会依次和各个 case 后的值进行比对,很明显都不匹配,最终执行了 default 后的代码,即输出“输入错误”。
对比 3 次执行结果,发现输入不同的值会有不同结果,switch 会从 case 中选择一个进行执行,如果都不匹配将执行 default 子句后的代码。
在以上案例中,我们可以发现多个 case 语句后的执行语句其实是一样的,即周一、周三、周五输出的都是“今天学习”,周二、周四、周六输出的都是“今天打球”。我们知道 switch 语句中如果某个 case 后的值匹配成功,将会从该 case 后的语句块起一直执行下去,直到遇到 break 语句,因此可以根据这一特点对以上案例进行优化:
import java.util.Scanner; public class Demo { public static void main(String[] args) { Scanner sca = new Scanner(System.in); System.out.println("--------请输入今天周几--------"); String week = sca.next(); switch (week) { case "周一": case "周三": case "周五": System.out.println("今天学习"); break; case "周二": case "周四": case "周六": System.out.println("今天打球"); break; case "周日": System.out.println("看电影去,放松一下"); break; default: System.out.println("输入错误"); } System.out.println("switch执行完毕"); } }运行程序,输入“周三”,运行结果如下:
-------请输入今天周几---------
周三
今天学习
switch执行完毕
再次运行程序,输入“星期三”,运行结果如下:
-------请输入今天周几---------
星期三
输入错误
switch执行完毕
第 2 次输入“星期三”,与所有 case 后的值都不匹配,将执行 default 子句后的代码。
在此需要注意,default 子句的书写并不一定在所有 case 的后面,它只要在 switch 语句中即可,可以在所有 case 前,也可以在最后,也可以穿插在 case 中间。
调整上面实例中 default 子句的位置,将其放到“周四”之前,代码如下:
import java.util.Scanner; public class Demo { public static void main(String[] args) { Scanner sca = new Scanner(System.in); System.out.println("--------请输入今天周几--------"); String week = sca.next(); switch (week) { case "周一": case "周三": case "周五": System.out.println("今天学习"); break; case "周二": case "周四": System.out.println("输入错误"); case "周六": System.out.println("今天打球"); break; case "周日": System.out.println("看电影去,放松一下"); break; default: System.out.println("输入错误"); } System.out.println("switch执行完毕"); } }运行程序,输入“星期三”,运行结果如下:
-------请输入今天周几---------
星期三
输入错误
今天打球
switch执行完毕
因此,即使 default 不在最后,同样需要添加 break 语句。修改代码如下:
import java.util.Scanner; public class Demo { public static void main(String[] args) { Scanner sca = new Scanner(System.in); System.out.println("--------请输入今天周几--------"); String week = sca.next(); switch (week) { case "周一": case "周三": case "周五": System.out.println("今天学习"); break; case "周二": case "周四": default: System.out.println("输入错误"); break; case "周六": System.out.println("今天打球"); break; case "周日": System.out.println("看电影去,放松一下"); break; } System.out.println("switch执行完毕"); } }运行程序,输入“星期三”,运行结果如下:
-------请输入今天周几---------
星期三
输入错误
switch执行完毕
总结
在 switch case 语句中,需要注意以下几点:- 同一个 switch 中 case 后的数值必须每一个都不同。
- default(默认)子句为可选语句,并且该语句位置可以不放到最后。
- switch 语句只能做等值比较,即用 switch 的表达式结果和各个 case 子句的值对比,如果相等则执行 case 后的语句,否则判断下一个。