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

08月23日 收藏 0 评论 3 java开发

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

转载声明:文章来源https://blog.csdn.net/a614528195/article/details/81083931

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

C 3条回复 评论
箱湘香樟树

这问题真不好答

发表于 2023-03-01 22:00:00
0 0
良木

这个结论不太对,因为case后面都有return,会直接返回的,类似了break的作用了。

发表于 2022-01-15 11:05:21
0 0
卫澜

上完课拿到想要的offer了!!谢谢大拿老师!

发表于 2021-12-06 12:20:00
0 0