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

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

public classAg{static public int i=10;public static voidmain(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");

}

}

}

输出为:

406b0c7fbe5eebecfb200897ea3924c5.png

下面通过例子来分析一下switch:

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

f2ecdae15120fe5adfb1ffdeaba97af1.png

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

da87338648661746a9e57ba84cc6973d.png

字节码分析如下:

public static voidmain(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_235: goto 43 //如果不用break,将继续执行接下来的语句,而不是跳出switch

38: iconst_5 //开始执行a==1时的操作

39: istore_240: goto 43

43: return //main方法执行结束

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

2dbb12eb28b030aa6e39b6948246c452.png

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

fd7279bdf6056ccc8209324de76c66bd.png

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

public static voidmain(java.lang.String[]);

Code:0: iconst_51: istore_12: iload_13: lookupswitch { //2

1: 28

2: 33

default: 38 //值得注意的是default依然在最后面,唯一变化的就是执行语句的位置

}28: iconst_5      //a==1语句的执行位置29: istore_230: goto 43

33: iconst_5      //a==2语句执行的位置34: istore_235: goto 43

38: iconst_5 //default语句执行的位置39: istore_240: goto 43

43: return}

总结:

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

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

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

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

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

public classAg{static public int i=10;public static voidmain(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");

}

}

}

结果就不用说了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值