×
post_content

一、分支语句

运算符学完了,接下来让代码根据条件”做选择”——这就是流程控制。

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 代码都绕不开的基础。

运算符优先级那张表不用背——遇到复杂的表达式,用小括号说清楚逻辑比秀优先级更专业

下一篇我们不讲新知识,而是把这一篇学到的运算符、进制、分支、循环串起来,走进几个案例和实战进行巩固。先别急着冲面向对象,先看看这些语法在实际控制台程序里怎么配合使用。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

作者

2248768396@qq.com

相关文章