因此可以在编译阶段进行评估(静态检查)
请参阅:http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.11为的正式定义
switch。
此外,它可以帮助您更好地了解如何将
switch其转换为字节码:
class Switch { void x(int n ) { switch( n ) { case 1: System.out.println("one"); break; case 9: System.out.println("nine"); break; default: System.out.println("nothing"); break; } }}并在编译后:
C:>javap -c SwitchCompiled from "Switch.java"class Switch extends java.lang.Object{Switch(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: returnvoid x(int); Code: 0: iload_1 1: lookupswitch{ //2 1: 28; 9: 39; default: 50 } 28: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 31: ldc #3; //String one 33: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 36: goto 58 39: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 42: ldc #5; //String nine 44: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 47: goto 58 50: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 53: ldc #6; //String nothing 55: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 58: return}看到标记为
1:
1: lookupswitch{ //2 1: 28; 9: 39; default: 50 }它评估该值并转到其他行。例如,如果值为value
9,它将跳转到指令39:
39: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 42: ldc #5; //String nine 44: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 47: goto 58
依次跳转到指令58:
58: return
如果它是动态评估的,那么所有这些都是不可能的。这就是为什么。



