正在加载...

Java 中的 switch

把整数 2 保存在名字 choice 下面。建一个 switch,列出 case 1、case 2 和 case 3——各自带自己的 println——再加上 default。编译并运行后,屏幕应显示一行 mid,因为 case 2 匹配。这一页教的就是:一个值,几个固定标签,一条选中的路径。

一个值,几个固定标签

创建一个小程序文件,名字叫 Dial.java。第一行的 public class 必须和文件名一致:public class Dial。不要在这个文件里保留旧的 Gate 或 Mint 类名;编译器要求类名和文件名一致。
在 main 里,先在 switch 之前保存一个整数:
int choice = 2;
这一行什么都不打印。它只是把值 2 交给名字 choice。choice 以小写 c 开头。2 周围没有引号。分号结束这一保存行。然后才是 switch 本身:
switch (choice) {
case 1:
System.out.println("low");
break;
case 2:
System.out.println("mid");
break;
case 3:
System.out.println("high");
break;
default:
System.out.println("none");
break;
}
单词 switch 是小写。圆括号里坐着名字 choice——Java 会拿它和每个 case 标签比较。每条 case 行以冒号结束,不是分号。case 2 下面是 System.out.println("mid");,然后是单词 break 和分号。当 choice 保存的是 2 时,Java 进入 case 2,打印 mid,碰到 break,离开整个 switch。这次运行里,case 3 和 default 都不会执行。编译前先保存文件。

打印 mid 的程序

这是你先编译的版本。choice 是 2,所以匹配的标签是 case 2。

choice 为 2

java
public class Dial {
    public static void main(String[] args) {
        int choice = 2;
        switch (choice) {
            case 1:
                System.out.println("low");
                break;
            case 2:
                System.out.println("mid");
                break;
            case 3:
                System.out.println("high");
                break;
            default:
                System.out.println("none");
                break;
        }
    }
}

在放着 Dial.java 的文件夹里运行 javac Dial.java。花括号、圆括号和冒号配对时,javac 自己不写任何一行。然后运行 java Dial——不是 java Dial.java。第二个命令不要带 .java 结尾。同样这两条命令在 Windows 和 macOS 上都适用;这一页不为任一系统要求不同的外壳拼写。程序应当打印 mid 并停下。它不会等你打字。如果终端在等键盘输入,说明文件里还留着旧练习的 nextLine 调用。删掉那个调用,保留 int 以及上面的 switch。屏幕行不对,也不需要重新安装 JDK。

为什么是 mid 而不是 low 或 high?因为圆括号里的值是 2,匹配的标签是 case 2。这次运行里,除非你专门为这个数字写 println,否则 Java 不会打印数字 2 本身。它打印的是匹配 case 下面 println 运行的内容。圆括号放被比较的值。这里每个 case 标签都是固定的整数。break 结束整个 switch,让后面的 case 保持安静。default 等着那些与任何 case 都不匹配的值——当 choice 是 2 时,default 不会用到。

当没有 case 匹配时

只改保存的值:
int choice = 9;
switch 结构保持原样。现在 case 1、case 2、case 3 都不匹配。Java 转到 default,运行 System.out.println("none");。屏幕上应出现一行 none。

choice 为 9

java
public class Dial {
    public static void main(String[] args) {
        int choice = 9;
        switch (choice) {
            case 1:
                System.out.println("low");
                break;
            case 2:
                System.out.println("mid");
                break;
            case 3:
                System.out.println("high");
                break;
            default:
                System.out.println("none");
                break;
        }
    }
}

再编译并运行:javac Dial.java,然后 java Dial。你应看到 none。你没有改写 case 行——只改了 choice 下面的值。看过 none 之后,可以把 int choice = 2; 放回去,回到第一个演示。两个版本都是合法的 Java。它们用同一种 switch 形状,一次教匹配的 case,一次教 default。

再按顺序读一遍 default 那次运行。choice 保存 9。switch (choice) 开始。case 1 不匹配。case 2 不匹配。case 3 不匹配。控制继续到 default。执行 println("none")。屏幕上只有一行。数字 9 本身不会出现,除非你故意打印它。

break 阻止后面的 case

break 不是装饰。没有它,匹配之后 Java 可以继续运行下一个 case 的行。这种落入(fall-through)会让初学者吃惊。这里有一个故意在 case 2 后漏掉 break 的短演示——单独试,或者在把它当作主课文件编译之前仔细读完:

case 2 后缺少 break

java
public class Dial {
    public static void main(String[] args) {
        int choice = 2;
        switch (choice) {
            case 1:
                System.out.println("low");
                break;
            case 2:
                System.out.println("mid");
            case 3:
                System.out.println("high");
                break;
            default:
                System.out.println("none");
                break;
        }
    }
}

当 choice 等于 2 且 case 2 下没有 break 时,屏幕可以先显示一行 mid,下一行再显示 high。case 2 匹配了,打印了 mid,然后落入 case 3 又打印了 high。前面的教学演示在每个 case 下都保留 break,好让每条路径正好写一行。在把 Dial.java 重新当作保留的课文件之前,把 break 放回去。

让标签保持清楚的规则

被切换的值外面的圆括号是必需的。写成 switch choice { … } 而没有圆括号,会让 javac 报错。这一页的每个 case 标签都是整数常量:case 1:、case 2:、case 3:。标签后面跟冒号。写成 case 2; 用分号代替冒号,不是本课会编译的形状。default 后面没有值——只有 default:,然后是「什么都不匹配」时的那些行。

switch 和 if 不是同一种工具。if (ready) 问的是 true 还是 false。switch (choice) 把一个值与一份固定标签列表匹配。不要写带 boolean 的 switch (ready),也不要期待和 Gate.java 一样的课形。这一页的演示留在名叫 choice 的 int 和整数 case 标签上。像 if (score > 10) 这种比较,需要范围时仍属于 if;当值是离散且事先已知时,switch 更合适。

常见混淆是打印语法本身:System.out.println("switch (choice)");。那会写出字符 switch (choice)。它不会挑选 case。另一种混淆是在同一个 main 里留下 Gate 页的 if / else 演示,然后奇怪屏幕为什么显示 pass 而不是 mid。本课的 main 应只保留 int 和 switch。

📊 choice 与屏幕

choice 屏幕
1 low
2 mid
3 high
9 none

把表格当作运行之后的核对,而不是代替运行。第一个演示里 choice 为 2 打印 mid。第二个演示里 choice 为 9 打印 none。choice 为 1 打印 low。choice 为 3 打印 high。如果 choice 为 2 时 mid 和 high 都出现了,说明 case 2 下缺少 break——修好 break,不要重装 Java。

你现在能做什么

你可以保存一个整数,放进 switch (…),并为每个固定值写出带 println 和 break 的 case。当某个 case 匹配时,那一行会运行;当什么都不匹配时,default 会运行。下一页是 for:在那里,当计数器变化时,同一块行可以一遍又一遍地运行。

🧠 测试您的知识

准备开始

测试您的知识

通过这个互动测验挑战自己,看看你对这个主题的理解程度如何

❓
6
问题
🎯
70%
及格要求
♾️
∞
时间
🔄
∞
尝试次数

📝 说明

  • 仔细阅读每个问题
  • 为每个问题选择最佳答案
  • 您可以随时重新参加测验
  • 您的进度将显示在顶部