在一次做题中遇到了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时的操作</span>
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 { //
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
}

总结:

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

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

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

3、当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");
}
}
}

结果就不用说了。

最新文章

  1. Java的关键字与标识符
  2. Java学习笔记-多线程-创建线程的方式
  3. MFC中的各种DC区别
  4. EL表达式 (详解)
  5. POJ1651Multiplication Puzzle(矩阵链乘变形)
  6. spring源码分析之spring-web web模块分析
  7. java技术栈:一、java编程语言概述
  8. Android ListView动态更新数据
  9. Xcode使用source control 时提示the server certificate failed to verify 的解决办法
  10. expect ------提供用户名和密码的SSH自动登录脚本
  11. ci公共模型类
  12. 【Android Developers Training】 57. 在UI线程之外处理图像
  13. img和父容器之间有间隙的问题
  14. .net 4.5 webform 提取ModelState错误信息
  15. Rational Rose_2007的下载、安装与破解--UML建模软件
  16. 单向循环链表C语言实现
  17. java中String的equals()和 ==
  18. iOS手机流量抓包rvictl
  19. Linux内核读书笔记第二周
  20. ios开发之--tableview刷新某一个区和某一行

热门文章

  1. 【已解决】Android Studio下,gradle project sync failed 错误
  2. 【WPF】UI虚拟化之------自定义VirtualizingWrapPanel
  3. 从零开始学习音视频编程技术(三) 开发环境搭建(Qt4.86手动设置环境,主要就是设置g++和qmake,比较透彻,附下载链接)
  4. iText类库再pdf中显示中文字体
  5. SqlServer &amp; Windows 可更新订阅立即更新启用分布式事务协调器(MSDTC)
  6. Android零基础入门第28节:轻松掌握RelativeLayout相对布局
  7. Android零基础入门第36节:Android系统事件的响应
  8. mysql5.7.18 初始化和运行
  9. 深入浅出RPC——深入篇(转载)
  10. 统计插件,Highcharts,以及modelformset