系列连载文章,大家可以从我的专栏学习Java入门基础知识,后续也会有更高级的Java特性、企业级开发框架,也有平常工作中的技术总结和分享,欢迎关注我的CDSN博客。同时可关注微信公众号“Java开发之旅”,获得更多技术资料!
目录
闲言碎语
switch结构的简介及语法
switch结构中的break
switch所支持的数据类型
小结
上一节我们学习了Java中的if选择结构,让我们实现了程序中的逻辑控制。Java当中还有一种选择结构叫做switch,下面我们就学习这个结构,大家注意总结和对比它和if之间的区别。
先上语法:
switch (变量或字面值) {
case 字面值1 :
//要执行的语句
break; //跳出标识,可选
case 字面值2 :
break;
//……
//任意个case分支
//……
default :
//要执行的语句
break;
}
以上语法中,每一个case表示一个分支,switch结构就是判断变量的值是否和某个分支的值相等,如果相等,那就执行这个分支里的代码;如果不相等,就继续往下判断其他的分支;如果所有分支都不相等,就执行default分支里的代码,即默认要执行的代码。当然,这里的default分支是可选的,如果所有case分支都不满足又没有default,那就什么都不执行。
看一个例子:
int num = 3;
switch (num) {
case 1:
System.out.println("num等于1,进入了第一个case分支");
break;
case 2:
System.out.println("num等于2,进入了第二个case分支");
break;
case 3:
System.out.println("num等于3,进入了第三个case分支");
break;
default:
System.out.println("没有满足条件的case分支,执行默认的default分支");
break;
}
以上代码,因为num的变量值是3,所以前两个case分支都不满足条件,所以执行了第三个case分支:
如果将num的值改为4,那么所有的case分支都不满足,就会执行default分支:
另外,switch结构的case分支只能给定字面值,即写死的值,不可以是变量,以下代码错误:
正是由于这个原因,switch只可以做等值判断,不可以做更灵活的区间判断,所以下面的代码也是错误的:
细心的同学可以发现,我们上面写的代码,其实等同于以下代码(前提是所有case分支都加了break):
int num = 3;
if (num == 1) {
System.out.println("num等于1,进入了第一个case分支");
}else if (num == 2) {
System.out.println("num等于2,进入了第二个case分支");
}else if (num == 3) {
System.out.println("num等于3,进入了第三个case分支");
}else {
System.out.println("没有满足条件的case分支,执行默认的default分支");
}
所以说,在等值判断的情况下,switch结构和if结构都可以实现,一般情况下为了简洁我们会选择switch结构。但有时候不得不使用if结构,比如区间判断或者更复杂的逻辑判断。
上面我提到break语句是可选的,而且我在转换为上面的if-else结构时,特意说明“前提是所有case分支都加了break”,为什么呢?
接下来就让我们一探break语句的究竟!
在switch语句中,break是可选的。当某一个case分支被执行完毕,如果此分支没有break,将继续执行后面的所有case分支,直到遇见break为止。如果后面的所有分支都没有break,那么将一直执行到default分支才会跳出整个switch结构。
int num = 1;
switch (num) {
case 1:
System.out.println("num等于1,进入了第一个case分支");
case 2:
System.out.println("num等于2,进入了第二个case分支");
case 3:
System.out.println("num等于3,进入了第三个case分支");
default:
System.out.println("没有满足条件的case分支,执行默认的default分支");
break;
}
以上代码,第一个case分支就被匹配上了,所以会输出“num等于1,进入了第一个case分支”。但是我们没有在这个分支加break,所以会继续往下执行其他的case分支(哪怕这些case分支的值并不是1),又因为后续所有的case分支都没有break,所以会一直执行到default分支,结束。
这里需要注意两点。第一:如果某个case分支被执行,但是却没有break,那么后续的所有case分支不管是否满足条件,都会被执行;第二,执行完default分支后结束了整个switch结构,但并不是因为default分支有break,而是因为default分支就是处于结构的最后,没有代码可执行了,所以一般情况下default分支也不用加break,这里只是让大家知道它可以加,但是没必要加。
如果我在case 2分支中加上break,那么就不会继续执行后续的case和default:
int num = 1;
switch (num) {
case 1:
System.out.println("num等于1,进入了第一个case分支");
case 2:
System.out.println("num等于2,进入了第二个case分支");
break;
case 3:
System.out.println("num等于3,进入了第三个case分支");
default:
System.out.println("没有满足条件的case分支,执行默认的default分支");
break;
}
switch结构支持以下6种数据类型:byte、short、int、char、String、枚举。
枚举类型会在后面的章节中引入,现在还太早。所以以下代码都是合法的:
char c = 'A';
switch (c) {
case 'A':
System.out.println("优秀");
break;
case 'B':
System.out.println("良好");
break;
case 'C':
System.out.println("差");
break;
default:
System.out.println("优秀");
}
String s = "A";
switch (s) {
case "A":
System.out.println("优秀");
break;
case "B":
System.out.println("良好");
break;
case "C":
System.out.println("差");
break;
default:
System.out.println("优秀");
}
另外,case分支的值必须和switch括号里的变量值是同一数据类型,你不能switch里给的是字符串类型,case分支的字面值却是数字类型:
switch结构的执行流程:
1、由上往下,依次判断每个case分支的字面值是否等于变量的值
2、如果相等则执行此分支中的代码,执行完毕后再看此分支是否有break语句,有的话直接跳出整个switch结构,没有的话就执行此分支后面的所有分支,直到遇见break语句跳出
3、如果不相等,则继续往下判断其他的分支,重复以上两个步骤
4、所有的case分支都不满足,此时如果有default分支则执行default,执行完default就跳出了switch结构,没有default就直接跳出switch结构,什么都不执行
switch结构和if结构的区别和联系:
1、switch结构只能进行等值判断,而if结构可以进行区间判断、负责逻辑的判断
2、等值判断下,switch结构要更简洁
3、所有的switch结构都可以转换为if-else结构,但if-else结构不一定可以转换为switch结构