欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java 开关语句switch中default的使用解析

程序员文章站 2022-05-02 08:19:52
...

      在学习《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();
	}
}

输出的结果:

Java 开关语句switch中default的使用解析

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();
	}
}

输出结果:

Java 开关语句switch中default的使用解析

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

 

相关标签: switch