在一次作題中遇到了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"); } } }
結果就不用說了。