switch表达式、case穿透

格式解释说明

switch表达式:可以是byte,short,int,char
JDK5以后可以是枚举
JDK7以后可以是字符串
case:后面的值就是要和表达式进行比较的值
break:表示程序到这里中断(字节码反编译能看出 也就是return),跳出switch语句
default:如果所有的情况都不匹配,就执行这里,相当于if语句中的else

default的位置不会影响执行结果,不管你编写的代码中default放在那里,这里的条件判断都是先按顺序比较其他非default值,当这些条件都不满足的时候,才跳转到default的相应代码处执行。

E:switch语句的结束条件

  a:遇到break就结束了,如果没有break会一直往下执行 直到执行末尾
  b:执行到末尾就结束了

 

public class SwitchCase {

    public static void main(String[] args){
        int NUMBER=9;
        switch(NUMBER){
            default: 
                System.out.println("not equals");
            case 9:
                System.out.println(9);
                break;
            case 10:
                System.out.println(10);
                break;
            case 11:
                System.out.println(11);
                break;
        }
    }

}

输出: 9

 通过反编译命令:    javap -v   SwitchCase.class >switch.txt 得到以下内容

public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=2, args_size=1
         0: bipush        9
         2: istore_1
         3: iload_1
         4: tableswitch   { // 9 to 11 代码执行的顺序
                       9: 40   //==9时候 执行32行
                      10: 51   //==9时候 执行43行
                      11: 62   //==11时候 执行54行 
                 default: 32   //默认执行65行(default情况下,虽然语句在前面,但是判断依然最后判断
            }
        32: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
        35: ldc           #3                      // String not equals  default代码在上面则生成的字节码顺序也在上面  注意这很关键!!!
        37: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        40: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
        43: bipush        9
        45: invokevirtual #5                  // Method java/io/PrintStream.println:(I)V
        48: goto          70   //跳转至70顺序行 return,如果没有return 那么会继续执行第43行 此时不会和case中的常量做比较
        51: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
        54: bipush        10
        56: invokevirtual #5                  // Method java/io/PrintStream.println:(I)V
        59: goto          70
        62: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
        65: bipush        11
        67: invokevirtual #5                  // Method java/io/PrintStream.println:(I)V
        70: return
      LineNumberTable:
        line 10: 0
        line 11: 3
        line 13: 32   //java代码中的15行代码 对应上面的32顺序
        line 15: 40
        line 16: 48
        line 18: 51
        line 19: 59
        line 21: 62
        line 24: 70

//高级开发笔试题
    public static void main(String[] args){
        int NUMBER=9;
        switch(NUMBER){
            case 9:
                System.out.println(9);
            case 12:
                System.out.println(12);
            case 11:
                System.out.println(11);
            default:
                System.out.println("都不匹配");
        }
    }

输出:
    9
    12
    11
    都不匹配

 将上面例子中的default语句调整 !!!


    public static void main(String[] args){
        int NUMBER=9;
        switch(NUMBER){
            default:
                System.out.println("都不匹配");
            case 9:
                System.out.println(9);
            case 12:
                System.out.println(12);
            case 11:
                System.out.println(11);

        }
    }

输出:
         9
         12
         11


 public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=2, args_size=1
         0: bipush        9
         2: istore_1
         3: iload_1
         4: tableswitch   { // 9 to 12

                       9: 44

                      10: 36

                      11: 60

                      12: 52
                 default: 36 //注意: 执行流程还是没有改变!!!
            }

        //此时default语句对应 将会改变输出的结果!!!
        36: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
        39: ldc           #3                  // String 都不匹配
        41: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        44: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;


        47: bipush        9
        49: invokevirtual #5                  // Method java/io/PrintStream.println:(I)V
        52: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
        55: bipush        12
        57: invokevirtual #5                  // Method java/io/PrintStream.println:(I)V
        60: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
        63: bipush        11
        65: invokevirtual #5                  // Method java/io/PrintStream.println:(I)V
        68: return                                //此时所有的case都执行完了 直接return 将不会执行到default语句!!!

参考:   https://www.cnblogs.com/blueskyli/p/9931428.html

          https://www.cnblogs.com/gj15991875299/p/4609436.html

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 、可私信6博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 、可私信6博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值