Java4:Java程序逻辑控制:让代码学会思考和重复
目录
写在前面
经过前三篇文章的学习,我们已经掌握了Java的基本数据类型、变量和运算符。但到目前为止,我们写的程序都是"直线"执行的——从上到下,一行接一行,没有任何分支和转折。
这就好比一台只会走直线的机器人,遇到岔路口不会拐弯,碰到重复劳动也不会偷懒。显然,真正的程序要比这灵活得多。
今天这篇文章,我们来学习Java中的程序逻辑控制——让代码能够做出判断、选择路径、重复执行。这是编程从"玩具"走向"工具"的关键一步。
一、程序的三种基本结构
任何复杂的程序,归根结底都由三种基本结构组成:
-
顺序结构:代码按书写顺序逐行执行
-
分支结构:根据条件决定执行哪段代码
-
循环结构:重复执行某段代码直到条件不满足
这三种结构可以组合出任意复杂的程序逻辑。我们先从最简单的顺序结构说起。
二、顺序结构:最朴素的执行方式
顺序结构是最直观的执行方式——代码从上往下,一行一行地执行。
System.out.println("第一行");
System.out.println("第二行");
System.out.println("第三行");
如果你调整代码的顺序,输出结果也会随之改变。这一点看似简单,但却是理解程序执行的基础。
三、分支结构:让代码学会选择
3.1 if语句:最常用的分支利器
if语句有三种语法格式,适用于不同场景。
格式一:单一判断
if (布尔表达式) {
// 条件为true时执行的代码
}
int score = 95;
if (score >= 90) {
System.out.println("奖励一个鸡腿!");
}
格式二:二选一
if (布尔表达式) {
// 条件为true时执行
} else {
// 条件为false时执行
}
int score = 85;
if (score >= 90) {
System.out.println("奖励一个大鸡腿!");
} else {
System.out.println("奖励一个大嘴巴子...");
}
格式三:多分支判断
if (布尔表达式1) {
// 表达式1为true时执行
} else if (布尔表达式2) {
// 表达式2为true时执行
} else {
// 都不满足时执行
}
来看一个实际例子:根据分数评定等级。
int score = 85;
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 if (score >= 0) {
System.out.println("不及格");
} else {
System.out.println("错误数据");
}
这里有个细节值得注意:由于if-else if是按顺序判断的,我们不需要在每个条件中都写上score < 90这样的上限判断——因为能走到第二个分支,说明前面的条件已经不成立了。
3.2 代码风格:大括号应该放哪里?
// 推荐风格
if (x == 10) {
// 语句
} else {
// 语句
}
// 另一种合法但不推荐的风格
if (x == 10)
{
// 语句
}
else
{
// 语句
}
Java社区普遍推荐第一种风格——左大括号跟在条件表达式后面。这样代码更紧凑,阅读起来也更流畅。
3.3 两个常见的坑
陷阱一:多写分号
int x = 10;
if (x == 10); { // 注意这里多了一个分号
System.out.println("hello");
}
这个分号成了if语句的"身体"(空语句),而后面的大括号里的代码变成了独立代码块,无论如何都会执行。
陷阱二:悬垂else
int x = 10;
int y = 10;
if (x == 10)
if (y == 10)
System.out.println("aaa");
else
System.out.println("bbb");
这里的else到底和哪个if配对?答案是:else与最近的if匹配。所以上面代码等价于:
if (x == 10) {
if (y == 10) {
System.out.println("aaa");
} else {
System.out.println("bbb");
}
}
为了避免这种歧义,强烈建议始终加上大括号。
3.4 switch语句:多路选择的另一种方案
当需要根据一个变量的多个取值分别执行不同逻辑时,switch语句也是一种选择。
int day = 3;
switch (day) {
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
case 4:
System.out.println("星期四");
break;
case 5:
System.out.println("星期五");
break;
case 6:
System.out.println("星期六");
break;
case 7:
System.out.println("星期日");
break;
default:
System.out.println("输入有误");
break;
}
使用switch的几个要点:
-
break不能省略:否则会发生"穿透"现象——匹配到一个case后,会继续执行后续所有case的代码,直到遇到break为止。
-
表达式类型有限制:只能是byte、char、short、int、String、枚举类型。不能是long、float、double。
-
case值不能重复。
-
无法表达复杂条件:比如
num > 10 && num < 20这种范围判断,switch无能为力。 -
不建议嵌套使用:switch套switch会让代码难以阅读和维护。
总的来说,switch的使用场景比较有限。能用if解决的问题,尽量用if解决。
四、循环结构:让代码学会重复
计算机最擅长的事情之一就是"重复"。循环结构让我们可以用几行代码完成成千上万次的重复操作。
4.1 while循环:先判断,后执行
while (循环条件) {
// 循环体
}
示例1:打印1到10
int num = 1;
while (num <= 10) {
System.out.println(num);
num++;
}
示例2:计算1到100的和
int n = 1;
int sum = 0;
while (n <= 100) {
sum += n;
n++;
}
System.out.println(sum); // 5050
示例3:计算5的阶乘
int n = 1;
int result = 1;
while (n <= 5) {
result *= n;
n++;
}
System.out.println(result); // 120
示例4:计算1! + 2! + 3! + 4! + 5!
int num = 1;
int sum = 0;
while (num <= 5) {
int factorResult = 1;
int tmp = 1;
while (tmp <= num) {
factorResult *= tmp;
tmp++;
}
sum += factorResult;
num++;
}
System.out.println(sum);
这里出现了嵌套循环——循环里面套循环。外层循环控制阶乘的求和,内层循环计算每个数的阶乘。随着嵌套层次增加,代码复杂度也会显著上升。
4.2 break:提前跳出循环
break的作用是立即结束当前循环,不管循环条件是否还满足。
// 找出100到200之间第一个3的倍数
int num = 100;
while (num <= 200) {
if (num % 3 == 0) {
System.out.println("找到了:" + num);
break;
}
num++;
}
执行到break时,循环立刻终止,程序继续执行循环后面的代码。
4.3 continue:跳过本次循环
continue的作用是跳过本次循环的剩余代码,直接进入下一次循环的条件判断。
// 打印100到200之间所有3的倍数
int num = 100;
while (num <= 200) {
if (num % 3 != 0) {
num++;
continue;
}
System.out.println("找到了3的倍数:" + num);
num++;
}
当执行到continue时,本次循环中continue之后的代码不再执行,直接回到循环条件判断处。
4.4 for循环:最常用的循环结构
for循环将循环的三个要素——初始化、条件判断、变量更新——集中在一行,结构更加清晰。
for (表达式1; 布尔表达式2; 表达式3) {
// 循环体
}
示例1:打印1到10
for (int i = 1; i <= 10; i++) {
System.out.println(i);
}
示例2:计算1到100的和
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
System.out.println(sum); // 5050
示例3:计算5的阶乘
int result = 1;
for (int i = 1; i <= 5; i++) {
result *= i;
}
System.out.println(result); // 120
示例4:计算1! + 2! + ... + 5!
int sum = 0;
for (int i = 1; i <= 5; i++) {
int tmp = 1;
for (int j = 1; j <= i; j++) {
tmp *= j;
}
sum += tmp;
}
System.out.println(sum);
使用for循环的注意事项:
-
表达式2(循环条件)如果缺失,循环会成为死循环
-
同样不建议在for后面多加一个分号
-
break和continue在for循环中的行为与while一致
4.5 do-while循环:先执行,后判断
do {
// 循环体
} while (循环条件);
do-while的特点是:至少执行一次循环体,然后再判断是否继续。
int num = 1;
do {
System.out.println(num);
num++;
} while (num <= 10);
在实际开发中,do-while的使用频率远低于for和while,了解即可。
五、综合练习:动手写一个猜数字游戏
学了这么多理论知识,不妨动手实践一下。下面是一个简单的猜数字游戏,综合运用了我们今天学的知识点。
import java.util.Random;
import java.util.Scanner;
public class GuessNumber {
public static void main(String[] args) {
Random random = new Random();
Scanner scanner = new Scanner(System.in);
// 生成1到100之间的随机数
int target = random.nextInt(100) + 1;
int guessCount = 0;
System.out.println("欢迎来到猜数字游戏!");
System.out.println("我已经想好了一个1到100之间的数字,请猜猜看吧。");
while (true) {
System.out.print("请输入你的猜测:");
int guess = scanner.nextInt();
guessCount++;
if (guess < target) {
System.out.println("猜小了,再大一点!");
} else if (guess > target) {
System.out.println("猜大了,再小一点!");
} else {
System.out.println("恭喜你,猜对了!");
System.out.println("你一共猜了" + guessCount + "次。");
break;
}
}
scanner.close();
}
}
这个程序用到了我们之前学的变量、运算符,以及今天学的if分支、while循环、break跳转。你能读懂每一行代码的含义吗?
总结
今天我们学习了Java程序逻辑控制的三大结构:
-
顺序结构:代码按顺序逐行执行
-
分支结构:if-else if-else实现多路选择,switch适用于有限选项的匹配
-
循环结构:while、for(最常用)、do-while(了解即可)
还学会了两个重要的控制语句:
-
break:立即结束循环
-
continue:跳过本次循环剩余代码
下一篇文章,我们将学习Java中的方法(函数)——如何把重复的代码封装起来,实现"一次编写,多次调用"。敬请期待!
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)