java中switch case语句需要加入break的原因解析

java中switch case语句需要加入break的原因解析

           java 中使用switch case语句需要加入break 做了具体的实例分析,及编译源码,在源码中分析应该如何使用,大家可以参考下:

假设我们有如下这样一个switch语句:

public static void test(int index) {
  switch (index) {
  case 1:
    System.out.println(1);
  case 2:
    System.out.println(2);
  case 3:
    System.out.println(3);
  default:
    System.out.println("Default");
  }
}

当我们在执行上面的方法时,如果我们传入的参数是1,那么会输出1、2、3和default,如果传入的参数是2,那么会输出2、3和default,这是为什么呢?这是因为switch的case语句是用来根据满足条件从确定的行开始执行的,如果不加入break语句跳出switch逻辑,则会一直往下执行,这也是为什么上面的测试代码会出现传入参数为2时会输出2、3和default。
为此,我们也可以看一下上面的代码编译后的class文件,通过eclipse打开后,我们可以看到如下内容:

 public static void test(int index);
   iload_0 [index]
    tableswitch default: 49
     case 1: 28
     case 2: 35
     case 3: 42
   getstatic java.lang.System.out : java.io.PrintStream [22]
   iconst_1
   invokevirtual java.io.PrintStream.println(int) : void [28]
   getstatic java.lang.System.out : java.io.PrintStream [22]
   iconst_2
   invokevirtual java.io.PrintStream.println(int) : void [28]
   getstatic java.lang.System.out : java.io.PrintStream [22]
   iconst_3
   invokevirtual java.io.PrintStream.println(int) : void [28]
   getstatic java.lang.System.out : java.io.PrintStream [22]
   ldc <String "Default"> [33]
   invokevirtual java.io.PrintStream.println(java.lang.String) : void [35]
   return

上面编译后的语句每行前面的数字是程序的指定序号,我们可以把它简单的理解为行号,我们可以看到数字为1的那行定义了一个switch指定,其默认会跳到49行,如果传入的参数是1则跳到28行执行,如果是2则跳到35行执行,如果是3则跳到42行执行。那么我们先来看程序的第28行到32行,其对应的就是调用System.out.println输出1,完了后没有特殊的指令,程序是会继续顺序执行的,也就是会依次执行35、38、直到57行结束。
如果我们把源程序的case语句末端都加上break语句,如下这样:

public static void test(int index) {
  switch (index) {
  case 1:
    System.out.println(1);
    break;
  case 2:
    System.out.println(2);
    break;
  case 3:
    System.out.println(3);
    break;
  default:
    System.out.println("Default");
    break;
  }
}

那么对应的编译的class文件通过Eclipse打开后可以看到如下内容:

public static void test(int index);
  iload_0 [index]
   tableswitch default: 58
    case 1: 28
    case 2: 38
    case 3: 48
  getstatic java.lang.System.out : java.io.PrintStream [22]
  iconst_1
  invokevirtual java.io.PrintStream.println(int) : void [28]
  goto 66
  getstatic java.lang.System.out : java.io.PrintStream [22]
  iconst_2
  invokevirtual java.io.PrintStream.println(int) : void [28]
  goto 66
  getstatic java.lang.System.out : java.io.PrintStream [22]
  iconst_3
  invokevirtual java.io.PrintStream.println(int) : void [28]
  goto 66
  getstatic java.lang.System.out : java.io.PrintStream [22]
  ldc <String "Default"> [33]
  invokevirtual java.io.PrintStream.println(java.lang.String) : void [35]
  return

我们可以看到switch语句默认会执行58行,如果传入的参数是1则会执行28行,如果是2则会从38行开始执行,接着我们可以看到28行开始是执行的System.out.println(1)的逻辑,完了后会顺序执行到35行,35行的指令是会引导程序执行到第66行,也就是跳出了switch逻辑,对应我们的测试代码就是程序结束了。这也是为什么我们在使用switch语句时通常需要在每个case语句结束时加入break指令的原因。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Java并发编程总结——慎用CAS详解

    一.CAS和synchronized适用场景 1.对于资源竞争较少的情况,使用synchronized同步锁进行线程阻塞和唤醒切换以及用户态内核态间的切换操作额外浪费消耗cpu资源:而CAS基于硬件实现,不需要进入内核,不需要切换线程,操作自旋几率较少,因此可以获得更高的性能. 2.对于资源竞争严重的情况,CAS自旋的概率会比较大,从而浪费更多的CPU资源,效率低于synchronized.以java.util.concurrent.atomic包中AtomicInteger类为例,其getAn

  • Java编程cas操作全面解析

    CAS 指的是现代 CPU 广泛支持的一种对内存中的共享数据进行操作的一种特殊指令.这个指令会对内存中的共享数据做原子的读写操作. 简单介绍一下这个指令的操作过程:首先,CPU 会将内存中将要被更改的数据与期望的值做比较.然后,当这两个值相等时,CPU 才会将内存中的数值替换为新的值.否则便不做操作.最后,CPU 会将旧的数值返回.这一系列的操作是原子的.它们虽然看似复杂,但却是 Java 5 并发机制优于原有锁机制的根本.简单来说,CAS 的含义是"我认为原有的值应该是什么,如果是,则将原有的

  • Java语言中cas指令的无锁编程实现实例

    最开始接触到相关的内容应该是从volatile关键字开始的吧,知道它可以保证变量的可见性,而且利用它可以实现读与写的原子操作...但是要实现一些复合的操作volatile就无能为力了...最典型的代表是递增和递减的操作.... 我们知道,在并发的环境下,要实现数据的一致性,最简单的方式就是加锁,保证同一时刻只有一个线程可以对数据进行操作....例如一个计数器,我们可以用如下的方式来实现: public class Counter { private volatile int a = 0; pub

  • java中switch case语句需要加入break的原因解析

    java中switch case语句需要加入break的原因解析            java 中使用switch case语句需要加入break 做了具体的实例分析,及编译源码,在源码中分析应该如何使用,大家可以参考下: 假设我们有如下这样一个switch语句: public static void test(int index) { switch (index) { case 1: System.out.println(1); case 2: System.out.println(2);

  • java中switch选择语句代码详解

    switch结构(开关语句)的语法 switch(表达式 ){ --->类型为int.char case 常量1 :--->case 结构可以有多个 //语句块1 break; --->程序跳出switch结构 case 常量n :--->常量的值不能相同 //语句块n break; default:--->和if结构中的 else作用相同 //语句块 break; } 下面看一段代码示例,有详细的注释,大家可以参考: public class SwitchStu{ /* s

  • 举例讲解Swift编程中switch...case语句的用法

    Switch作为选择结构中必不可少的语句也被加入到了Swift中,只要有过编程经验的人对Switch语句都不会感到陌生,但苹果对Switch进行了大大的增强,使其拥有其他语言中没有的特性.使用Switch语句很简单: var i = 0 switch i { case 0: "0" //被输出 case 1: "1" default: "2" } 在这个最简单的Switch语句中,与其他语言很不同的一点是:不用显式的加上break.Swift的S

  • Java中switch判断语句典型使用实例

    下面一个是典型的switch语法运用的例子. import java.util.Scanner; public class JudgeMonth { public static void main(String[] arg){ Scanner scan = new Scanner(System.in); System.out.println("请输入月份:"); int month = scan.nextInt(); switch(month){ case 12: case 1: ca

  • java中的switch case语句使用详解

    java中的switch case语句 switch-case语句格式如下: switch(变量){ case 变量值1: //; break; case 变量值2: //...; break; ... case default: //...; break; } swtich()变量类型只能是int.short.char.byte和enum类型(JDK 1.7 之后,类型也可以是String了).当进行case判断时,JVM会自动从上到小扫描,寻找匹配的case,可能存在以下情况: 情况一:若未

  • Java 如何在switch case语句中声明变量

    目录 在switch case语句中声明变量 第一种情况常见的场景为 第二种情况常见的场景为 Java switch-case语句用法及例题 原理归原理,下面是一个例题 在switch case语句中声明变量 Java中使用switch case语句时很容易出现以下两个报错: 1.Duplicate local veriable out. (局部变量重复) 2.The local veriable out may not have been initialized. (局部变量可能未被初始化)

  • 详解Swift的switch...case语句中break关键字的用法

    与Objective-C中这部分内容相比,在Swift中switch得到了极大的改善.这是一件非常有趣的事,因为这还是没有添加到Objective-C中,还是没有打破Objective-C是C的超集的事实. 第一件令人兴奋的地方是可以对字符串转换.这也许正是你之前想要做,却不能做的事.在Objective-C中如果要对字符串用"switch",你必须要使用多个if语句,同时要用isEqualToString:,像下面这样: if ([person.name isEqualToStrin

  • Swift编程中的switch...case语句实例解析

    Swift中的switch...case语句可以判断对象类型, Objective-C中则必须是整数. 不可以穿透,可以不写break, var rank = "A" switch rank{ case "A": //相当于if print("优") case "B": // 相当于else if print("优") case "C": // 相当于else if print(&quo

  • Java中Switch用法代码示例

    一.java当中的switch与C#相比有以下区别 注:在java中switch后的表达式的类型只能为以下几种:byte.short.char.int(在Java1.6中是这样),  在java1.7后支持了对string的判断 还有一点要注意的是:在java中如果switch的case语句中少写了break;这个关键字,在编译的时候并没有报错.但是在执行的时候会一直执行所有case条件下的语句并不是去判断,所以会一直执行直到遇到break关键字跳出或者一直执行到defaut语句. 还有就是如果

  • Java中switch的三种用法方式

    Java中switch的三种用法详解: switch居然有三种方式 ? 作为一个接触java不久的人来说,这确实让我吃了一惊! 根据版本,在java14开始, switch语句有了一个很大的调整, 这就让swicth语句有了更多的操作和选择,在代码上,更加的简便灵活, 让我们试试这神奇的switch吧! 使用switch这个关键词, 我们可以很好的解决if-else 中多重选择的尴尬场面! Java中switch的三种用法详解: switch 标准方式 switch - > 用法: switch

随机推荐