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代码块的话,程序就没有返回值,会抛出异常。

猜你喜欢

转载自blog.csdn.net/a614528195/article/details/81083931