[Java 简明教程] Java switch case 语句

yufei       6 年, 2 月 前       1521

Java switch case 语句用于判断一个表达式的结果与一系列中的某个值是否相等,如果相等则执行一些语句。

一系列中的每个值都是一个 case 分支。

语法

Java switch case 语句的语法格式一般如下

switch(expression){
    case value1 :  // 值 1
       //如果 expression 和 value1 匹配则执行这个语句
       break; //可选
    case value2 :  // 值 2
       //语句
       break; // 可选
    //其它可以有任意数量的case语句
    default :      //如果都不匹配,则执行这个分支 可选
       //语句
}

从这个语法格式中可以看到, Java switch case 语句和五个单词息息相关: switchcase:breakexpression

  1. switchexpressionswitch 翻译成中文是开关的意思,因此 switch(expression) 可以理解为 expression 这个开关。而 expression 是一个表达式,一个表达式就是一条有返回值的语句。

  2. case 和冒号 : : case 翻译成中文有 "事例” 、"例" 的意思,因此 case value1 可以理解为如果为 value1 这个事例,其实也就是说如果等于 value1 的话。

    冒号 : 一般用于提起下文 ( 坑爹的中文 ),在任何语言中,冒号的作用就是如果冒号之前的表达式为真,则运行冒号之后的语句。

  3. break 翻译成中文有打断的意思。而在 switch case 语句中的意思是打断整个 switch case 语句,也就是不继续执行 switch 语句。

    注意: 在 Java 语法中,break 语句总是用于打断和它匹配的关键字语句的执行,在 switch 语句中,这个匹配的关键字就是 switch 语句。

  4. default 是默认的意思,这个关键字后面没有任何可选的值,只有一个冒号 : 。表示如果上面的 case 语句都没有匹配到,那么就执行这个语句。

switch case 语句的运行流程

了解了 Java switch case 语句的语法,了解了 switch case 语句中每个关键字的作用,那么,要理解 Java switch case 语句的流程就很简单了。

  1. 当执行流程遇到 switch 关键字时,首先会计算 expression 表达式的值。Java 中的表达式有三种情况

    • expression 可以是一个常量或者变量,类型只能是基础类型,例如 byteshortintcharString (Java 7 新增了字符串类型 String )。不能是其它类类型或者自定义类型。
    • expression 可以是一个简单的运算,比如 1+22+3,但是,运算的结果必须是上面所说的基本类型。
    • expression 可以是一个方法调用,比如 add(1,2) ,但方法的返回值必须是上面提到的基本类型。
  2. 计算完 expression 表达式的结果后,就会与每个 case 关键字后面的 value 匹配,如果匹配成功,则运行 case 语句冒号后面的所有语句。这里有几个点非常重要:

    • 每个 switch case 语句可以有多个 case 分支,分支数量不限。每个 case 后面跟一个要比较的值和冒号

    • value1value2value3 几个必须是一个变量或者常量或者字面量,不能是运算操作或者方法调用。也就是说它们必须是一个实实在在的值,比如 2简单教程 等。

    • 匹配时除了匹配值外, 还会比较它们的数据类型,数据类型不同,也不会匹配,比如,如果 expression 表达式的返回结果是字符串 '1' ,而 case 语句为 case 1: ,那么也不会匹配,因为数据类型不同。

    • 还有一点,也是最重要的一点,一旦某个 case 语句被匹配上,那么之后所有的 case 语句 ( 包括 default 语句 ) 都会被执行 ( 也就是忽略匹配 ),直到遇到 break 语句。

      这条规则很反人类,因为我们的固定思维,就是一个 case 对应一个匹配,如果匹配不成功,则不执行,但实际上并不是这样的,而是一旦匹配,之后所有的 case 语句都被执行。

    • 如果流程继续的过程中遇到 break 语句,则会终止 switch 语句的执行,也就是说 break 语句之后的所有 switch 其它语句都不会执行了。break 语句并不是必须的,case 语句里可以有 break ,也可以没有 break

    • switch case 语句还可以包含一个可选的 default 语句 ( default 分支 )。当任何一个 case 语句都不匹配时,才会执行 default 分支。

      default 语句可以位于任何位置,可以位于两个 case 语句之间,可以有,也可以没有 break 语句。 但要注意的是,default 的执行时机,是没有任何 case 语句匹配才执行。

我们总结一下:

  1. Java switch case 语句是一个顺序执行语句,会先计算 expression 表达式的值,并且按照顺序与每一个 case 语句匹配,如果匹配不成功,则不运行 case 冒号之后的语句。如果匹配成功,则会执行匹配的 case 语句,并且会导致剩余的所有 case 语句都匹配成功。

  2. 因为一旦匹配成功,剩余的所有 case 语句都会匹配成功,有时候,可能需要在某个时刻中断 switch 语句,这时候就需要 break 语句了,在 break 语句后的所有 switch 语句都不会执行。

  3. 如果没有 case 语句匹配到,那么就会查找 switch 中的 default 语句,一旦找到,则执行 default 语句。

    注意: default 语句与 case 语句的顺序很重要,如果没有任何一个 case 被匹配,而 default 语句又没有 break ,那么后续所有的 case 语句也会执行。

范例

在当前目录下,创建一个文件 SwitchCaseTester.java ,本章接下来所有的范例,我们都会在这个文件中完成。

1. 正常的使用,每个 case 分支都有一个 break 语句

public class SwitchCaseTester
{
   public static void main(String args[])
   {
      char grade = 'B';
      System.out.println("你的等级是 " + grade);

      switch(grade)
      {
         case 'S':
            System.out.println("完美");
            break;
         case 'A' :
            System.out.println("优秀"); 
            break;
         case 'B' :
            System.out.println("良好");
            break;
         case 'C' :
            System.out.println("及格");
            break;
         case 'F' :
            System.out.println("不及格");
            break;
         default :
            System.out.println("未知等级");
      } 
   }
}

编译运行以上范例,输出结果如下

[yufei@www.twle.cn java]$ javac SwitchCaseTester.java && java SwitchCaseTester
你的等级是 B
良好

2. 如果要将 'B',也改为优秀

最简单的方法就是就是把 'B' 中的输出语句改成优秀

public class SwitchCaseTester
{
   public static void main(String args[])
   {
      char grade = 'B';
      System.out.println("你的等级是 " + grade);

      switch(grade)
      {
         case 'S':
            System.out.println("完美");
            break;
         case 'A' :
            System.out.println("优秀"); 
            break;
         case 'B' :
            System.out.println("优秀");
            break;
         case 'C' :
            System.out.println("及格");
            break;
         case 'F' :
            System.out.println("不及格");
            break;
         default :
            System.out.println("未知等级");
      } 
   }
}

编译运行以上范例,输出结果如下

[yufei@www.twle.cn java]$ javac SwitchCaseTester.java && java SwitchCaseTester
你的等级是 B
优秀

而最 switch case 的做法,就是删掉 'A' 里面的语句,并把 'B' 的输出改成优秀

public class SwitchCaseTester
{
   public static void main(String args[])
   {
      char grade = 'B';
      System.out.println("你的等级是 " + grade);

      switch(grade)
      {
         case 'S':
            System.out.println("完美");
            break;
         case 'A' :
         case 'B' :
            System.out.println("优秀");
            break;
         case 'C' :
            System.out.println("及格");
            break;
         case 'F' :
            System.out.println("不及格");
            break;
         default :
            System.out.println("未知等级");
      } 
   }
}

编译运行以上范例,输出结果如下

[yufei@www.twle.cn java]$ javac SwitchCaseTester.java && java SwitchCaseTester
你的等级是 B
优秀

3. 如果没有任何一个 case 被匹配,则会运行 default 分支

我们把上面的范例中的 grade 改成 G

public class SwitchCaseTester
{
   public static void main(String args[])
   {
      char grade = 'G';
      System.out.println("你的等级是 " + grade);

      switch(grade)
      {
         case 'S':
            System.out.println("完美");
            break;
         case 'A' :
         case 'B' :
            System.out.println("优秀");
            break;
         case 'C' :
            System.out.println("及格");
            break;
         case 'F' :
            System.out.println("不及格");
            break;
         default :
            System.out.println("未知等级");
      } 
   }
}

编译运行以上范例,输出结果如下

[yufei@www.twle.cn java]$ javac SwitchCaseTester.java && java SwitchCaseTester
你的等级是 G
未知等级

4. 如果成功匹配的 case 没有 break 语句,那么它会一直执行,直到遇到 break 语句

我们再改改第一个范例,把 case B 中的 break 语句删掉

public class SwitchCaseTester
{
   public static void main(String args[])
   {
      char grade = 'B';
      System.out.println("你的等级是 " + grade);

      switch(grade)
      {
         case 'S':
            System.out.println("完美");
            break;
         case 'A' :
            System.out.println("优秀"); 
            break;
         case 'B' :
            System.out.println("良好");
         case 'C' :
            System.out.println("及格");
            break;
         case 'F' :
            System.out.println("不及格");
            break;
         default :
            System.out.println("未知等级");
      } 
   }
}

编译运行以上范例,输出结果如下

[yufei@www.twle.cn java]$ javac SwitchCaseTester.java && java SwitchCaseTester
你的等级是 B
良好
及格

从运行结果中可以看到,因为 grade'B' ,所以 case 'B' 被匹配,输出结果 良好。但因为 case 'B' 中并没有 break 语句,所以会继续执行下一个 case 语句而忽略是否匹配,也就是执行 case C ,输出 及格 ,因为 case 'C' 中有 break 语句,所以跳出了 break 语句,那么后面的 case 'F' 并没有得到执行。

目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.