經過字節碼分析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");
        }
    }
}

結果就不用說了。

相關文章
相關標籤/搜索