这些生活中的"如果...就..."、"重复直到..."的逻辑,在Java中就是流程控制语句。它们让程序不再只是简单执行,而是能根据情况做出决策和重复工作
流程控制
流程控制就是控制代码执行顺序的语句,它让程序能够:
- 选择性执行:根据不同条件执行不同的代码
- 重复执行:让代码块重复执行多次
- 跳转执行:改变代码的正常执行顺序
三大流程控制结构及代码示例
1. 条件语句:让程序学会"做选择"
if-else 语句
public class IfElseDemo {
public static void main(String[] args) {
System.out.println("=== if-else 条件语句示例 ===");
// 示例1:简单的if语句
int score = 85;
System.out.println("学生成绩: " + score + "分");
if (score >= 60) {
System.out.println("恭喜!成绩及格了!");
}
// 示例2:if-else语句
int temperature = 28;
System.out.println("\n当前温度: " + temperature + "°C");
if (temperature > 30) {
System.out.println("天气炎热,建议穿短袖");
} else {
System.out.println("天气适中,可以穿长袖");
}
// 示例3:多重if-else if-else语句
int hour = 14; // 24小时制
System.out.println("\n当前时间: " + hour + "点");
if (hour >= 6 && hour < 12) {
System.out.println("现在是上午");
} else if (hour >= 12 && hour < 18) {
System.out.println("现在是下午");
} else if (hour >= 18 && hour < 22) {
System.out.println("现在是晚上");
} else {
System.out.println("现在是深夜");
}
// 示例4:嵌套if语句
boolean isWeekend = false;
boolean isSunny = true;
System.out.println("\n今天是周末吗? " + isWeekend);
System.out.println("天气晴朗吗? " + isSunny);
if (isWeekend) {
if (isSunny) {
System.out.println("去公园野餐!");
} else {
System.out.println("在家看电影!");
}
} else {
System.out.println("去上班/上学");
}
}
}
switch 语句
public class SwitchDemo {
public static void main(String[] args) {
System.out.println("=== switch 语句示例 ===");
// 示例1:根据星期几输出不同的活动
int dayOfWeek = 3; // 1=周一, 2=周二, ..., 7=周日
switch (dayOfWeek) {
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:
case 7:
System.out.println("周末:好好休息!");
break;
default:
System.out.println("无效的星期数");
break;
}
// 示例2:根据成绩等级给出评语
char grade = 'B';
System.out.println("\n学生等级: " + grade);
switch (grade) {
case 'A':
System.out.println("优秀!继续保持!");
break;
case 'B':
System.out.println("良好!还有进步空间!");
break;
case 'C':
System.out.println("中等!需要更努力!");
break;
case 'D':
System.out.println("及格!要加油了!");
break;
case 'F':
System.out.println("不及格!需要补考!");
break;
default:
System.out.println("无效的等级");
}
// 示例3:Java 12+ 新的switch表达式
System.out.println("\n=== Java 12+ switch表达式 ===");
String season = "春天";
String activity = switch (season) {
case "春天" -> "去郊游赏花";
case "夏天" -> "去海边游泳";
case "秋天" -> "去登山赏叶";
case "冬天" -> "在家吃火锅";
default -> "正常上班上学";
};
System.out.println(season + "的活动建议: " + activity);
}
}
2. 循环语句:让程序学会"重复做事"
for 循环
public class ForLoopDemo {
public static void main(String[] args) {
System.out.println("=== for 循环示例 ===");
// 示例1:基础for循环
System.out.println("1. 打印1到5:");
for (int i = 1; i <= 5; i++) {
System.out.println("数字: " + i);
}
// 示例2:计算1到100的和
System.out.println("\n2. 计算1到100的和:");
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
System.out.println("1到100的和是: " + sum);
// 示例3:打印乘法表
System.out.println("\n3. 9×9乘法表:");
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j + "×" + i + "=" + (i * j) + "\t");
}
System.out.println();
}
// 示例4:遍历数组
System.out.println("\n4. 遍历数组:");
int[] scores = {85, 92, 78, 90, 88};
System.out.println("学生成绩列表:");
for (int i = 0; i < scores.length; i++) {
System.out.println("第" + (i + 1) + "个学生成绩: " + scores[i] + "分");
}
// 示例5:增强for循环(for-each)
System.out.println("\n5. 使用for-each遍历数组:");
String[] fruits = {"苹果", "香蕉", "橙子", "葡萄"};
System.out.println("水果列表:");
for (String fruit : fruits) {
System.out.println("水果: " + fruit);
}
}
}
while 循环
public class WhileLoopDemo {
public static void main(String[] args) {
System.out.println("=== while 循环示例 ===");
// 示例1:基础while循环
System.out.println("1. 倒计时:");
int countdown = 5;
while (countdown > 0) {
System.out.println("倒计时: " + countdown);
countdown--; // 不要忘记改变条件,否则会无限循环!
}
System.out.println("发射!");
// 示例2:用户输入验证
System.out.println("\n2. 密码验证模拟:");
String correctPassword = "123456";
String enteredPassword = "";
int attempts = 0;
int maxAttempts = 3;
// 模拟用户尝试输入密码
java.util.Scanner scanner = new java.util.Scanner(System.in);
while (!enteredPassword.equals(correctPassword) && attempts < maxAttempts) {
attempts++;
System.out.print("请输入密码(尝试" + attempts + "/" + maxAttempts + "): ");
enteredPassword = scanner.nextLine();
if (!enteredPassword.equals(correctPassword)) {
System.out.println("密码错误!");
}
}
if (enteredPassword.equals(correctPassword)) {
System.out.println("登录成功!");
} else {
System.out.println("尝试次数过多,账户已锁定!");
}
// 示例3:计算阶乘
System.out.println("\n3. 计算5的阶乘:");
int number = 5;
long factorial = 1;
int i = 1;
while (i <= number) {
factorial *= i;
i++;
}
System.out.println(number + "! = " + factorial);
}
}
do-while 循环
public class DoWhileDemo {
public static void main(String[] args) {
System.out.println("=== do-while 循环示例 ===");
// 示例1:至少执行一次
System.out.println("1. 菜单选择:");
java.util.Scanner scanner = new java.util.Scanner(System.in);
int choice;
do {
System.out.println("\n===== 主菜单 =====");
System.out.println("1. 查看信息");
System.out.println("2. 修改信息");
System.out.println("3. 退出系统");
System.out.print("请选择(1-3): ");
choice = scanner.nextInt();
switch (choice) {
case 1:
System.out.println("正在查看信息...");
break;
case 2:
System.out.println("正在修改信息...");
break;
case 3:
System.out.println("正在退出系统...");
break;
default:
System.out.println("无效选择,请重新输入!");
}
} while (choice != 3);
System.out.println("系统已退出!");
// 示例2:猜数字游戏
System.out.println("\n2. 猜数字游戏:");
int secretNumber = 42;
int guess;
int attempts = 0;
do {
attempts++;
System.out.print("猜一个1-100之间的数字: ");
guess = scanner.nextInt();
if (guess < secretNumber) {
System.out.println("猜小了!");
} else if (guess > secretNumber) {
System.out.println("猜大了!");
}
} while (guess != secretNumber);
System.out.println("恭喜!猜对了!");
System.out.println("你猜了" + attempts + "次");
}
}
3. 跳转语句:改变程序执行流程
public class JumpStatements {
public static void main(String[] args) {
System.out.println("=== 跳转语句示例 ===");
// break示例:提前结束循环
System.out.println("1. break语句:查找第一个大于50的数");
int[] numbers = {23, 45, 67, 12, 89, 34};
for (int i = 0; i < numbers.length; i++) {
if (numbers[i] > 50) {
System.out.println("找到第一个大于50的数: " + numbers[i]);
System.out.println("它在数组中的位置: 第" + (i + 1) + "个");
break; // 找到后立即退出循环
}
}
// continue示例:跳过当前迭代
System.out.println("\n2. continue语句:打印1-10之间的奇数");
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) { // 如果是偶数
continue; // 跳过本次循环的剩余部分
}
System.out.print(i + " ");
}
// 带标签的break和continue
System.out.println("\n\n3. 带标签的break:");
outerLoop: // 标签
for (int i = 1; i <= 3; i++) {
System.out.println("外层循环第" + i + "次");
for (int j = 1; j <= 3; j++) {
System.out.println(" 内层循环第" + j + "次");
if (i == 2 && j == 2) {
System.out.println(" 跳出外层循环!");
break outerLoop; // 跳出外层循环
}
}
}
// return示例
System.out.println("\n4. return语句:");
System.out.println("调用方法前");
printMessage();
System.out.println("调用方法后");
}
public static void printMessage() {
System.out.println(" 方法开始执行");
for (int i = 1; i <= 5; i++) {
if (i == 3) {
System.out.println(" 遇到3,提前返回");
return; // 结束方法执行,返回调用处
}
System.out.println(" 当前数字: " + i);
}
System.out.println(" 方法正常结束"); // 这行不会执行
}
}
综合示例:学生成绩管理系统
import java.util.Scanner;
public class StudentGradeManagement {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("=== 学生成绩管理系统 ===");
// 输入学生数量
System.out.print("请输入学生数量: ");
int studentCount = scanner.nextInt();
// 创建数组存储成绩
String[] studentNames = new String[studentCount];
double[] studentGrades = new double[studentCount];
// 输入学生信息和成绩
for (int i = 0; i < studentCount; i++) {
System.out.println("\n--- 第" + (i + 1) + "个学生 ---");
System.out.print("请输入学生姓名: ");
studentNames[i] = scanner.next();
boolean validGrade = false;
while (!validGrade) {
System.out.print("请输入学生成绩(0-100): ");
double grade = scanner.nextDouble();
if (grade >= 0 && grade <= 100) {
studentGrades[i] = grade;
validGrade = true;
} else {
System.out.println("成绩无效!请输入0-100之间的数字。");
}
}
}
// 统计和分析
System.out.println("\n=== 成绩统计结果 ===");
double total = 0;
double highest = studentGrades[0];
double lowest = studentGrades[0];
String highestStudent = studentNames[0];
String lowestStudent = studentNames[0];
for (int i = 0; i < studentCount; i++) {
// 累加总分
total += studentGrades[i];
// 查找最高分
if (studentGrades[i] > highest) {
highest = studentGrades[i];
highestStudent = studentNames[i];
}
// 查找最低分
if (studentGrades[i] < lowest) {
lowest = studentGrades[i];
lowestStudent = studentNames[i];
}
}
// 计算平均分
double average = total / studentCount;
System.out.println("班级平均分: " + String.format("%.2f", average));
System.out.println("最高分: " + highest + " (" + highestStudent + ")");
System.out.println("最低分: " + lowest + " (" + lowestStudent + ")");
// 统计各分数段人数
int excellent = 0, good = 0, medium = 0, pass = 0, fail = 0;
for (int i = 0; i < studentCount; i++) {
if (studentGrades[i] >= 90) {
excellent++;
} else if (studentGrades[i] >= 80) {
good++;
} else if (studentGrades[i] >= 70) {
medium++;
} else if (studentGrades[i] >= 60) {
pass++;
} else {
fail++;
}
}
System.out.println("\n=== 分数段统计 ===");
System.out.println("优秀(90-100): " + excellent + "人");
System.out.println("良好(80-89): " + good + "人");
System.out.println("中等(70-79): " + medium + "人");
System.out.println("及格(60-69): " + pass + "人");
System.out.println("不及格(0-59): " + fail + "人");
// 查找特定学生
System.out.print("\n请输入要查找的学生姓名: ");
String searchName = scanner.next();
boolean found = false;
for (int i = 0; i < studentCount; i++) {
if (studentNames[i].equalsIgnoreCase(searchName)) {
System.out.println("找到学生: " + studentNames[i]);
System.out.println("成绩: " + studentGrades[i]);
// 判断等级
if (studentGrades[i] >= 90) {
System.out.println("等级: 优秀");
} else if (studentGrades[i] >= 80) {
System.out.println("等级: 良好");
} else if (studentGrades[i] >= 70) {
System.out.println("等级: 中等");
} else if (studentGrades[i] >= 60) {
System.out.println("等级: 及格");
} else {
System.out.println("等级: 不及格");
}
found = true;
break;
}
}
if (!found) {
System.out.println("未找到学生: " + searchName);
}
scanner.close();
System.out.println("\n=== 程序结束 ===");
}
}
注意事项
- if语句条件:条件必须是布尔表达式,不能用数字代替
- switch的break:忘记写break会导致"穿透"现象,会继续执行后面的case
- 循环控制变量:确保循环有结束条件,避免无限循环
- 循环性能:嵌套循环的时间复杂度是O(n²),数据量大时性能差
- break和continue:谨慎使用,过多使用会影响代码可读性
- 浮点数比较:不要用
==比较浮点数,应该判断差值是否在允许范围内