格式解释说明
switch表达式:可以是byte,short,int,char
JDK5以后可以是枚举
JDK7以后可以是字符串
case:后面的值就是要和表达式进行比较的值
break:表示程序到这里中断(字节码反编译能看出 也就是return),跳出switch语句
default:如果所有的情况都不匹配,就执行这里,相当于if语句中的elsedefault的位置不会影响执行结果,不管你编写的代码中default放在那里,这里的条件判断都是先按顺序比较其他非default值,当这些条件都不满足的时候,才跳转到default的相应代码处执行。
E:switch语句的结束条件
a:遇到break就结束了,如果没有break会一直往下执行 直到执行末尾
b:执行到末尾就结束了
public class SwitchCase { public static void main(String[] args){ int NUMBER=9; switch(NUMBER){ default: System.out.println("not equals"); case 9: System.out.println(9); break; case 10: System.out.println(10); break; case 11: System.out.println(11); break; } } } 输出: 9
通过反编译命令: javap -v SwitchCase.class >switch.txt 得到以下内容
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=2, args_size=1
0: bipush 9
2: istore_1
3: iload_1
4: tableswitch { // 9 to 11 代码执行的顺序
9: 40 //==9时候 执行32行
10: 51 //==9时候 执行43行
11: 62 //==11时候 执行54行
default: 32 //默认执行65行(default情况下,虽然语句在前面,但是判断依然最后判断
}
32: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
35: ldc #3 // String not equals default代码在上面则生成的字节码顺序也在上面 注意这很关键!!!
37: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
40: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
43: bipush 9
45: invokevirtual #5 // Method java/io/PrintStream.println:(I)V
48: goto 70 //跳转至70顺序行 return,如果没有return 那么会继续执行第43行 此时不会和case中的常量做比较
51: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
54: bipush 10
56: invokevirtual #5 // Method java/io/PrintStream.println:(I)V
59: goto 70
62: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
65: bipush 11
67: invokevirtual #5 // Method java/io/PrintStream.println:(I)V
70: return
LineNumberTable:
line 10: 0
line 11: 3
line 13: 32 //java代码中的15行代码 对应上面的32顺序
line 15: 40
line 16: 48
line 18: 51
line 19: 59
line 21: 62
line 24: 70
//高级开发笔试题
public static void main(String[] args){
int NUMBER=9;
switch(NUMBER){
case 9:
System.out.println(9);
case 12:
System.out.println(12);
case 11:
System.out.println(11);
default:
System.out.println("都不匹配");
}
}
输出:
9
12
11
都不匹配
将上面例子中的default语句调整 !!!
public static void main(String[] args){
int NUMBER=9;
switch(NUMBER){
default:
System.out.println("都不匹配");
case 9:
System.out.println(9);
case 12:
System.out.println(12);
case 11:
System.out.println(11);}
}输出:
9
12
11
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=2, args_size=1
0: bipush 9
2: istore_1
3: iload_1
4: tableswitch { // 9 to 129: 44
10: 36
11: 60
12: 52
default: 36 //注意: 执行流程还是没有改变!!!
}//此时default语句对应 将会改变输出的结果!!!
36: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
39: ldc #3 // String 都不匹配
41: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
44: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
47: bipush 9
49: invokevirtual #5 // Method java/io/PrintStream.println:(I)V
52: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
55: bipush 12
57: invokevirtual #5 // Method java/io/PrintStream.println:(I)V
60: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
63: bipush 11
65: invokevirtual #5 // Method java/io/PrintStream.println:(I)V
68: return //此时所有的case都执行完了 直接return 将不会执行到default语句!!!