Java 开关语句switch中default的使用解析
在学习《Thinking in java》7.2.2中看到一个开关语句中default的用法很奇怪,所以就决定研究一下这个骚操作。
原文代码如下:
package exam;
import oypj.tools.*;
class Shape{
void draw(){}
void erase(){}
}
class Circle extends Shape{
void draw(){
P.rintln("Circle.draw()");
}
void erase(){
P.rintln("Cicle.erase()");
}
}
class Squre extends Shape{
void draw(){
P.rintln("Squre.draw()");
}
void erase(){
P.rintln("Squre.erase()");
}
}
class Triangle extends Shape{
void draw(){
P.rintln("Triangle.draw()");
}
void erase(){
P.rintln("Triangle.erase()");
}
}
public class Shapes {
public static Shape randShape(){
switch((int)(Math.random()*3)){
default:
case 0: return new Circle();
case 1: return new Squre();
case 2: return new Triangle();
}
}
public static void main(String[] args){
Shape[] s=new Shape[9];
for(int i=0;i<9;i++)
s[i]=randShape();
for(int i=0;i<9;i++)
s[i].draw();
}
}
输出的结果:
1.分析代码:
default 写在case前面而且default的代码块没有用break。所以当switch中的表达式没有匹配到0、1、2的时候,
程序会执行default中的语句块,由于default代码块中没有break,所以当处理完default中的代码块时,会继续往下
执行。
2.修改代码验证一下分析:
修改后代码如下:
package exam;
import oypj.tools.*;
class Shape{
void draw(){}
void erase(){}
}
class Circle extends Shape{
void draw(){
P.rintln("Circle.draw()");
}
void erase(){
P.rintln("Cicle.erase()");
}
}
class Squre extends Shape{
void draw(){
P.rintln("Squre.draw()");
}
void erase(){
P.rintln("Squre.erase()");
}
}
class Triangle extends Shape{
void draw(){
P.rintln("Triangle.draw()");
}
void erase(){
P.rintln("Triangle.erase()");
}
}
public class Shapes {
public static Shape randShape(){
switch(3){
default: System.out.println("default");
case 0: System.out.println("default0"); return new Circle();
case 1: System.out.println("default1"); return new Squre();
case 2: System.out.println("default2"); return new Triangle();
}
}
public static void main(String[] args){
Shape[] s=new Shape[9];
for(int i=0;i<9;i++)
s[i]=randShape();
for(int i=0;i<9;i++)
s[i].draw();
}
}
输出结果:
3.修改后代码分析:
从运行的结果来看,程序确实是像我们第1点分析的那样执行。但是,在default语句块中我们就打印了一个
字符串default,然后程序继续往下执行的时候执行了case 0中的语句块。这跟我们想的有点不一样。当我把
case 1 放在case 0前面的时候,再次执行程序,发现default打印了一个default后,执行了case 1 中的语句
块。
由此我们可以看出,在开关语句中,把default写在case前面,而且default的语句块中没有任何处理的时候,
当switch()表达式中的值匹配不到case 的时候,就执行default中的代码块而且还会默认执行紧靠在default后
的case 代码块。我觉得这是java编译器为了程序能正常运行做的一种处理,因为如果不默认执行紧靠在default
后的case代码块的话,程序就没有返回值,会抛出异常。
上一篇: JAVA用for循环制作简单的日历
下一篇: div块水平垂直居中的方法