Java教程
Java标识符与关键字
Java变量
Java数据类型
Java运算符
Java控制语句
Java方法
Java面向对象
Java对象的创建和使用
Java封装
Java中static和this
Java继承
Java方法覆盖和多态
Java super
Java基础练习题

Java switch选择语句

switch语句和if语句一样,都属于选择语句(分支语句),不再赘述,我们直接来看一下一个比较完整的switch语句结构是怎样的,请看下图:

图6-8:switch语句完整结构

switch运行原理是怎样的呢,请看下图:

图6-9:switch语句运行原理图

switch运行原理文字性描述是这样的(以上图为例):拿着c和表达式1进行比较,如果相等,则执行语句1,如果不相等,继续拿着c和表达式2进行比较,如果相等,则执行语句2,如果不相等,继续...,如果c和所有的分支表达式都不相等,此时default分支“语句n+1”则执行。

以上描述是switch语句的一般性执行流程,实际上在执行过程中还有很多因素的影响,接下来我将列出使用switch语句的一些注意事项:

● switch语句后面的小括号“()”当中都可以出现什么,在JDK1.6之前(包括1.6在内)switch只能探测int类型的数据,但是在JDK1.7之后(包括1.7在内),switch语句除了支持int类型之外,还支持String类型。也就是说从Java7开始switch后面小括号中可以出现字符串。

● switch虽然只能探测int类型,但是也可以将byte,short,char类型放到小括号当中,因为这些类型会自动转换成int类型(小容量向大容量转换称为自动类型转换)。

● switch语句当中case是可以进行合并的,例如以下代码:

switch(90){
case 100 : case 90 : case 80 : case 70 : 
	System.out.println("过关了");
	break;
case 60:
	System.out.println("失败了");
	break;
default : 
	System.out.println("出错了");
}

● switch语句当中当某个分支匹配成功,则开始执行此分支当中的java语句,当遇到当前分支中的“break;”语句,switch语句就结束了,但是如果当前分支中没有“break;”语句,则会发生case穿透现象,也就是说下一个分支也不再进行匹配,直接进入下一个分支执行,直到遇到“break;”为止。例如以下代码:

char c = 'A';
switch(c){
case 'A' :
	System.out.println(1);
case 'B' :
	System.out.println(2);
	break;
default :
	System.out.println(3);
}

执行结果如下所示:

图6-10:switch的case穿透测试

接下来我们来看几个switch的经典案例,请看代码:

示例代码1:从键盘接收一个数字[1-7],当数字是1~5的时候,控制台输出工作日,当数字是6~7的时候,控制台输出休息日,其他数字提示错误信息。

java.util.Scanner scan = new java.util.Scanner(System.in);
System.out.print("请输入[1-7]的整数数字:");
int dayOfWeek = scan.nextInt();
switch(dayOfWeek){
case 1: case 2: case 3: case 4: case 5:
	System.out.println("今天是工作日哦!");
	break;
case 6:case 7:
	System.out.println("今天是休息日哦!");
	break;
default :
	System.out.println("对不起,您的输入有误");
}

示例代码2:业务背景:键盘接收一个学生的成绩(假设成绩是合法的),范围在[0-100],根据成绩判断等级,[90-100]等级为“优秀”,[80-90)等级为“良好”,[70-80)等级为“中等”,[60-70)等级为“及格”,[0-60)等级为“大笨蛋”。只允许使用switch,不允许使用if语句。

java.util.Scanner scan = new java.util.Scanner(System.in);
System.out.print("请输入考试成绩[0-100]:");
double score = scan.nextDouble();
String grade = "大笨蛋";
switch((int)(score / 10)){
case 10: case 9:
	grade = "优秀";
	break;
case 8:
	grade = "良好";
	break;
case 7:
	grade = "中等";
	break;
case 6:
	grade = "及格";
	break;
}
System.out.println("成绩等级为:" + grade);

运行结果如下图所示:

图6-11:switch判断成绩等级

图6-12:switch判断成绩等级

以上程序在编写时候的核心技巧是:[90-100]分的所有数字,包括浮点型数字,让其除以10之后强转为int类型,结果一定是9或者10。[80-90)分的所有数字,除以10之后取整,结果一定是8,以此类推。没关系同学们,大家在起初学习的时候不一定会马上写出来以上程序,这个过程是需要积累的,下去之后先自己模仿我的程序,慢慢的你就会写了。

if和switch都是条件判断语句(分支语句/选择语句),在效果上是没有什么差别的。而不同,我们可以从效率上来看一看,举一个很简单的例子: if(a > b) { a = b;} else { b = a; } 如果将这个例子放在switch语句中,也并不是不能实现,但是实现起来可能会比较麻烦一些,因为在switch语句中case要求的是常量,一般是不能进行逻辑判断的,所以这也是if语句优于switch语句的地方。但是如果您判断的都是几个常量的数据,我建议您最好采用switch语句,虽然if语句也是能实现的,但是性能就比switch差的有点远了。