- 0
- 337 words
一、分支语句
运算符学完了,接下来让代码根据条件”做选择”——这就是流程控制。
7.1 if-else
最基本的条件分支:
int score = 75;
if (score >= 90) {
System.out.println("优秀");
} else if (score >= 80) {
System.out.println("良好");
} else if (score >= 70) {
System.out.println("中等");
} else if (score >= 60) {
System.out.println("及格");
} else {
System.out.println("不及格,继续努力");
}
// 输出:中等
几个好习惯:
- 即使只有一行代码,也建议加
{}。避免以后加代码时忘了加括号导致的 bug。 - 条件表达式中的常量写在前面:
if ("OK".equals(status))而不是if (status.equals("OK"))——避免 status 为 null 时抛 NullPointerException。 - 把最常见的条件放在最前面,减少判断次数。
7.2 switch 语句
当需要判断的是某个变量的固定取值(而不是范围)时,switch 比 if-else 更清晰:
int dayOfWeek = 3;
String dayName;
switch (dayOfWeek) {
case 1:
dayName = "周一";
break;
case 2:
dayName = "周二";
break;
case 3:
dayName = "周三";
break;
case 4:
dayName = "周四";
break;
case 5:
dayName = "周五";
break;
case 6:
case 7:
dayName = "周末";
break;
default:
dayName = "无效的星期";
}
System.out.println(dayName); // 周三
关于 break 和穿透(fall-through):
如果不写 break,会继续执行下一个 case:
int x = 1;
switch (x) {
case 1:
System.out.println("一");
// ❌ 忘了 break,继续往下走了
case 2:
System.out.println("二");
break;
default:
System.out.println("其他");
}
// 输出:
// 一
// 二
穿透有时是有意为之(如上方的 case 6 和 7 共享代码),但更多时候是 bug。所以 IDEA 等 IDE 会提示你:switch 的每个 case 最好都有 break 或注释说明。
7.3 Java 14+ 的 switch 表达式
Java 12 开始预览、Java 14 正式引入的增强 switch,写法更简洁、不会再忘记 break:
// switch 表达式(Java 14+)
String result = switch (dayOfWeek) {
case 1 -> "周一";
case 2 -> "周二";
case 3 -> "周三";
case 4 -> "周四";
case 5 -> "周五";
case 6, 7 -> "周末";
default -> "无效";
};
System.out.println(result); // 周三
// 还可以在多行代码时用 yield 返回值
String result2 = switch (dayOfWeek) {
case 1 -> {
System.out.println("匹配到周一");
yield "周一"; // yield 返回 switch 表达式的值
}
default -> "其他";
};
如果你在用 Java 17+,尽量用箭头语法——不用写 break、没有穿透问题、可以作为表达式直接赋值,代码量少一半。
二、循环语句
循环就是让一段代码重复执行。Java 提供了三种循环方式:
8.1 for 循环
最常用的循环,适用于已知循环次数的场景:
// 语法:for (初始化; 条件判断; 迭代)
for (int i = 0; i < 5; i++) {
System.out.println("第 " + (i + 1) + " 次循环");
}
// 执行顺序:
// 1. 初始化(int i = 0)——只执行一次
// 2. 条件判断(i < 5)——true 进入循环体,false 退出
// 3. 执行循环体
// 4. 迭代(i++)
// 5. 回到第 2 步
几个变体:
// 多个变量初始化
for (int i = 0, j = 10; i < j; i++, j--) {
System.out.println(i + " - " + j);
}
// 死循环(配合 break 退出)
for (;;) {
// 等价于 while(true)
}
// 增强 for 循环(for-each)——遍历数组/集合
int[] numbers = {1, 2, 3, 4, 5};
for (int num : numbers) {
System.out.println(num);
}
8.2 while 循环
适用于不知道要循环多少次,只知道什么时候结束的场景:
// while:先判断再执行
int i = 0;
while (i < 5) {
System.out.println(i);
i++;
}
// do-while:至少执行一次,再判断
int j = 0;
do {
System.out.println(j);
j++;
} while (j < 5); // 注意这里有分号
// while 和 do-while 的核心区别
int k = 10;
while (k < 5) {
System.out.println("while 执行了"); // 不会执行
}
do {
System.out.println("do-while 执行了"); // 会执行一次
} while (k < 5);
使用建议:日常 90% 的循环用 for(遍历数组、集合、固定次数),8% 用 while(等待条件满足),2% 用 do-while(至少执行一次的场景)。
8.3 break 和 continue
两个控制循环跳转的关键字:
// break:立即跳出整个循环
for (int i = 0; i < 10; i++) {
if (i == 5) {
break; // i 到 5 就跳出,后面的不执行了
}
System.out.print(i + " "); // 0 1 2 3 4
}
// continue:跳过本次循环,进入下一次
for (int i = 0; i < 5; i++) {
if (i == 2) {
continue; // i 等于 2 时不打印,进入下一次
}
System.out.print(i + " "); // 0 1 3 4
}
带标签的 break 和 continue(跳出多层循环):
outer: // 标签
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i == 1 && j == 1) {
break outer; // 直接跳出外层循环
}
System.out.println("i=" + i + ", j=" + j);
}
}
// 输出:
// i=0, j=0
// i=0, j=1
// i=0, j=2
// i=1, j=0
带标签的 break/continue 在日常编码中用得不多,但在处理二维数组搜索、图遍历时非常实用。不过能用独立方法 + return 解决的,尽量别用标签——代码可读性更好。
三、运算符优先级一表打尽
当多个运算符出现在同一个表达式里,谁先算谁后算?:
| 优先级 | 运算符 |
|---|---|
| 1(最高) | () [] . |
| 2 | ++ -- + - ~ !(一元运算符) |
| 3 | * / % |
| 4 | + - |
| 5 | << >> >>>(移位,暂不展开) |
| 6 | < <= > >= instanceof |
| 7 | == != |
| 8 | & |
| 9 | ^ |
| 10 | | |
| 11 | && |
| 12 | || |
| 13 | ?: |
| 14 | = += -= *= /= %= 等赋值 |
日常建议:别指望记全这张表。遇到不确定的优先级,加小括号 () 即可——既避免了歧义,代码也更清晰。
// 不推荐——依赖默认优先级
int result = a + b * c >> 2 & 0xFF;
// 推荐——用括号清晰表达意图
int result = ((a + (b * c)) >> 2) & 0xFF;
结语
这一篇内容不少,我们从算术运算符开始,捋清了 i++ 和 ++i 的本质区别、短路与的工作机制、三元运算符的妙用,再到 if-else 和 switch 两种分支选择,最后覆盖了 for / while / do-while 三种循环以及 break / continue 的跳转控制。这些都是你写每一行 Java 代码都绕不开的基础。
运算符优先级那张表不用背——遇到复杂的表达式,用小括号说清楚逻辑比秀优先级更专业。
下一篇我们不讲新知识,而是把这一篇学到的运算符、进制、分支、循环串起来,走进几个案例和实战进行巩固。先别急着冲面向对象,先看看这些语法在实际控制台程序里怎么配合使用。