第 4 章 / 共 20 章
流程控制
if / for / while / break / switch 语句 + 表达式
if 语句
条件必须是 boolean 类型(不像 C 那样 int 能当条件)。else if 链式判断常见。
// IfDemo.java
public class IfDemo {
public static void main(String[] args) {
int score = 75;
if (score >= 90) {
System.out.println("A");
} else if (score >= 80) {
System.out.println("B");
} else if (score >= 60) {
System.out.println("C");
} else {
System.out.println("F");
}
}
}for 循环
C 风格三段式:初始化;条件;步进。条件为 false 时退出。
// ForDemo.java
public class ForDemo {
public static void main(String[] args) {
// 三段式
for (int i = 0; i < 3; i++) {
System.out.println("i=" + i);
}
// 多变量
for (int i = 0, j = 10; i < j; i++, j--) {
System.out.println(i + " " + j);
}
}
}增强 for(for-each)
用于遍历数组或任何实现 Iterable 的集合。简洁但拿不到索引——如果需要索引,改用三段式。
// ForEach.java
import java.util.List;
public class ForEach {
public static void main(String[] args) {
int[] nums = {1, 2, 3};
for (int n : nums) {
System.out.println(n);
}
List<String> names = List.of("Alice", "Bob", "Carol");
for (String name : names) {
System.out.println(name);
}
}
}while 与 do-while
while 先判断再执行(可能一次都不跑);do-while 至少执行一次再判断。
// WhileDemo.java
public class WhileDemo {
public static void main(String[] args) {
int n = 5;
while (n > 0) {
System.out.println(n);
n--;
}
int input;
int tries = 0;
do {
input = (int) (Math.random() * 10);
tries++;
} while (input != 7);
System.out.println("got 7 after " + tries + " tries");
}
}break / continue / 标签
break 跳出最近的循环 / switch;continue 进入下一次迭代。Java 支持标签,跳出嵌套循环最干净。
// Labels.java
public class Labels {
public static void main(String[] args) {
outer:
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (i * j > 6) {
System.out.println("stop at " + i + "," + j);
break outer; // 跳出外层
}
if (j == 2) {
continue outer; // 跳到外层的下一次迭代
}
System.out.println(i + "," + j);
}
}
}
}传统 switch 语句
传统 switch 按 case 标签匹配,不写 break 会"穿透"到下一个 case(这是历史包袱,常常出 bug)。switch 支持 int / String / enum 等。
// SwitchOld.java
public class SwitchOld {
public static void main(String[] args) {
String day = "MON";
switch (day) {
case "SAT":
case "SUN":
System.out.println("weekend");
break;
case "MON":
case "TUE":
case "WED":
case "THU":
case "FRI":
System.out.println("workday");
break;
default:
System.out.println("unknown");
}
}
}switch 表达式(Java 14+)
现代 switch:箭头语法、不会穿透、能作为表达式赋值、多 case 合并用逗号。
// SwitchNew.java
public class SwitchNew {
public static void main(String[] args) {
String day = "MON";
// 作为语句
switch (day) {
case "SAT", "SUN" -> System.out.println("weekend");
case "MON", "TUE", "WED", "THU", "FRI" -> System.out.println("workday");
default -> System.out.println("unknown");
}
// 作为表达式:直接 return 一个值
int code = switch (day) {
case "SAT", "SUN" -> 0;
case "MON", "TUE", "WED", "THU", "FRI" -> 1;
default -> -1;
};
System.out.println("code=" + code);
}
}switch 表达式 + yield(复杂分支)
如果某个 case 需要多行代码计算值,用 { ... yield value; }。yield 是 switch 表达式专用的"返回"关键字。
// SwitchYield.java
public class SwitchYield {
public static void main(String[] args) {
int month = 2;
int year = 2024;
int days = switch (month) {
case 1, 3, 5, 7, 8, 10, 12 -> 31;
case 4, 6, 9, 11 -> 30;
case 2 -> {
boolean leap = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
yield leap ? 29 : 28;
}
default -> throw new IllegalArgumentException("bad month: " + month);
};
System.out.println(year + "-" + month + " has " + days + " days");
}
}