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

来源:互联网 发布:淘宝网装饰腰带 编辑:程序博客网 时间:2024/06/09 14:20

在一次做题中遇到了switch的问题,由于对switch执行顺序的不了解,在这里简单的通过字节码的方式理解一下switch执行顺序(题目如下):


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如截图所示:


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

字节码分析如下:

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时的操作     39: istore_2     40: goto          43     43: return   //main方法执行结束

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



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


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

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      29: istore_2      30: goto          43      33: iconst_5      34: istore_2      35: goto          43      38: iconst_5      39: istore_2      40: goto          43      43: return}


总结:


从上面的两个代码中可以得到:

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

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

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




0 0
原创粉丝点击