经过字节码分析java中的switch语句

在一次作题中遇到了switch的问题,因为对switch执行顺序的不了解,在这里简单的经过字节码的方式理解一下switch执行顺序(题目以下):java

public class Ag{
    static public int i=10;
    public static void main(String []args){
        switch(i){
            default:
                System.out.println("this is default");
            case 1:
                System.out.println("this is one");
            case 2:
                System.out.println("this is two");
            case 10:
                System.out.println("this is ten");
            case 5:
                System.out.println("this is five");
        }
    }

}

输出为:工具

下面经过例子来分析一下switch:测试

    1、首先代码1如截图所示:this

  简单说一下代码,代码很简单,就是在一个类中建一个main方法,而后在main方法中使用一个switch语句(注意了,这个代码中default在最前面),而后经过javap工具获取字节码,进而对switch的执行方式进行分析,获得的字节码截图以下:spa

字节码分析以下:code

 

public static void main(java.lang.String[]);
   Code:
      0: iconst_5//将常量5进入操做栈
      1: istore_1//将栈顶数据存入局部变量1
      2: iload_1//将第一个局部变量入栈
      3: lookupswitch  { // 2   //出现switch那必然是switch语句了
                    1: 33  //当a==1时,执行标号33的语句
                    2: 38  //当a==2时,执行标号38的语句
              default: 28   //default状况下,虽然语句在前面,可是判断依然最后判断,执行标号28的语句
         }
     28: iconst_5  //开始执行default里面的内容
     29: istore_2  //28和29语句相似于int b =5
     30: goto          43  //因为使用了break,跳出了语句,因此执行语句43,也就是跳出了switch,下同
     33: iconst_5//开始执行a==1时的操做
     34: istore_2
     35: goto          43  //若是不用break,将继续执行接下来的语句,而不是跳出switch
     38: iconst_5         //开始执行a==1时的操做</span>
     39: istore_2
     40: goto          43
     43: return   //main方法执行结束

2、第二个测试代码(default放到了最后面):blog

   一样的简单说一下代码,代码很简单,就是在一个类中建一个main方法,而后在main方法中使用一个switch语句(注意了,这个代码中default在最后面),而后经过javap工具获取字节码,进而对switch的执行方式进行分析,获得的字节码截图以下:it

字节码分析以下,只需关注两次代码中字节码的异同点:class

public static void main(java.lang.String[]);
    Code:
       0: iconst_5
       1: istore_1        
       2: iload_1
       3: lookupswitch  { // 2
                     1: 28
                     2: 33
               default: 38    //值得注意的是default依然在最后面,惟一变化的就是执行语句的位置
          }
      28: iconst_5      //a==1语句的执行位置
      29: istore_2
      30: goto          43
      33: iconst_5      //a==2语句执行的位置
      34: istore_2      
      35: goto          43
      38: iconst_5          //default语句执行的位置
      39: istore_2
      40: goto          43
      43: return
}

总结:变量

 

从上面的两个代码中能够获得:

一、无论switch中default位置如何,它都是最后一个进行判断的;

二、虽然default是最后一个进行判断的,可是default中的语句的位置依然和default在句中的位置有关(这句话接近于废话,可是,当case语句中没有break时,整个switch也就相似于顺序的去执行)

三、当case中没有break时,它的执行顺序和执行方式就是继续向下执行,直到switch结束或者遇到break。

 

最后来一个小例子测试一下对本文的分析(怎么这么眼熟,对,就是最开始的那个代码稍微改了一点):

public class Ag{
    static public int i=10;
    public static void main(String []args){
        switch(i){
            default:
                System.out.println("this is default");
            case 1:
                System.out.println("this is one");
            case 2:
                System.out.println("this is two");
            case 5:
                System.out.println("this is five");
        }
    }
}

结果就不用说了。

相关文章
相关标签/搜索