Appearance
流程控制
流程控制语句用于控制程序的执行顺序。Java 提供了条件语句、循环语句和跳转语句来控制程序流程。
流程控制分类
text
┌─────────────────────────────────────────────────────────────────┐
│ Java 流程控制 │
├─────────────────────────────────────────────────────────────────┤
│ 条件语句:if-else、switch-case │
│ 循环语句:for、while、do-while、增强for │
│ 跳转语句:break、continue、return │
└─────────────────────────────────────────────────────────────────┘条件语句
if 语句
if 语句根据条件决定是否执行某段代码。
java
public class IfStatement {
public static void main(String[] args) {
int age = 18;
// 基本 if 语句
if (age >= 18) {
System.out.println("您已成年");
}
// if-else 语句
int score = 55;
if (score >= 60) {
System.out.println("及格");
} else {
System.out.println("不及格");
}
// if-else if-else 语句
int grade = 85;
if (grade >= 90) {
System.out.println("优秀");
} else if (grade >= 80) {
System.out.println("良好");
} else if (grade >= 60) {
System.out.println("及格");
} else {
System.out.println("不及格");
}
// 嵌套 if 语句
int mathScore = 85;
int englishScore = 90;
if (mathScore >= 60) {
if (englishScore >= 60) {
System.out.println("两门课都及格了");
} else {
System.out.println("数学及格,英语不及格");
}
} else {
System.out.println("数学不及格");
}
}
}switch 语句
switch 语句根据变量的值选择执行的分支。
java
public class SwitchStatement {
public static void main(String[] args) {
// 基本 switch 语句
int day = 3;
switch (day) {
case 1:
System.out.println("星期一");
break; // 跳出 switch
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("无效的星期数");
}
// switch 穿透(不写 break)
int month = 3;
switch (month) {
case 1:
case 2:
case 3:
System.out.println("第一季度");
break;
case 4:
case 5:
case 6:
System.out.println("第二季度");
break;
case 7:
case 8:
case 9:
System.out.println("第三季度");
break;
case 10:
case 11:
case 12:
System.out.println("第四季度");
break;
default:
System.out.println("无效的月份");
}
// Java 14+ 新语法(箭头语法)
// int num = 2;
// String result = switch (num) {
// case 1 -> "一";
// case 2 -> "二";
// case 3 -> "三";
// default -> "其他";
// };
// 字符串类型的 switch(Java 7+)
String fruit = "苹果";
switch (fruit) {
case "苹果":
System.out.println("选择了苹果");
break;
case "香蕉":
System.out.println("选择了香蕉");
break;
case "橙子":
System.out.println("选择了橙子");
break;
default:
System.out.println("未知水果");
}
// 枚举类型的 switch
Season season = Season.SUMMER;
switch (season) {
case SPRING:
System.out.println("春天");
break;
case SUMMER:
System.out.println("夏天");
break;
case AUTUMN:
System.out.println("秋天");
break;
case WINTER:
System.out.println("冬天");
break;
}
}
}
// 季节枚举
enum Season {
SPRING, SUMMER, AUTUMN, WINTER
}循环语句
for 循环
for 循环适合已知循环次数的场景。
java
public class ForLoop {
public static void main(String[] args) {
// 基本 for 循环
// 语法:for (初始化; 条件; 更新) { 循环体 }
System.out.println("基本 for 循环:");
for (int i = 1; i <= 5; i++) {
System.out.println("第 " + i + " 次循环");
}
// 计算 1 到 100 的和
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
System.out.println("1到100的和: " + sum); // 5050
// 嵌套 for 循环(打印九九乘法表)
System.out.println("\n九九乘法表:");
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(); // 换行
}
// 打印三角形
System.out.println("\n三角形:");
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= i; j++) {
System.out.print("* ");
}
System.out.println();
}
// 省略部分表达式的 for 循环
int k = 0;
for (; k < 5; ) {
System.out.println("k = " + k);
k++;
}
// 无限循环
// for (;;) {
// // 无限循环,需要 break 跳出
// }
}
}增强 for 循环(for-each)
增强 for 循环用于遍历数组或集合。
java
public class ForEachLoop {
public static void main(String[] args) {
// 遍历数组
int[] numbers = {1, 2, 3, 4, 5};
System.out.println("遍历数组:");
for (int num : numbers) {
System.out.println("元素: " + num);
}
// 遍历字符串数组
String[] fruits = {"苹果", "香蕉", "橙子"};
System.out.println("\n遍历字符串数组:");
for (String fruit : fruits) {
System.out.println("水果: " + fruit);
}
// 计算数组元素之和
int sum = 0;
for (int num : numbers) {
sum += num;
}
System.out.println("\n数组元素之和: " + sum);
// 注意:增强 for 循环无法获取索引,也无法修改数组元素
// for (int num : numbers) {
// num = 0; // 这不会修改原数组
// }
}
}while 循环
while 循环在条件为真时重复执行。
java
public class WhileLoop {
public static void main(String[] args) {
// 基本 while 循环
int count = 1;
System.out.println("while 循环:");
while (count <= 5) {
System.out.println("count = " + count);
count++;
}
// 计算 1 到 100 的和
int sum = 0;
int i = 1;
while (i <= 100) {
sum += i;
i++;
}
System.out.println("\n1到100的和: " + sum); // 5050
// 猜数字游戏
int target = 7;
int guess = 0;
java.util.Scanner scanner = new java.util.Scanner(System.in);
// 演示用,实际使用时取消注释
// System.out.println("\n猜数字游戏(1-10):");
// while (guess != target) {
// System.out.print("请输入你的猜测: ");
// guess = scanner.nextInt();
// if (guess < target) {
// System.out.println("太小了!");
// } else if (guess > target) {
// System.out.println("太大了!");
// }
// }
// System.out.println("恭喜你,猜对了!");
// 无限循环
// while (true) {
// // 需要使用 break 跳出
// }
scanner.close();
}
}do-while 循环
do-while 循环至少执行一次,然后检查条件。
java
public class DoWhileLoop {
public static void main(String[] args) {
// 基本 do-while 循环
int count = 1;
System.out.println("do-while 循环:");
do {
System.out.println("count = " + count);
count++;
} while (count <= 5);
// 即使条件一开始就不满足,也会执行一次
int num = 10;
System.out.println("\n条件不满足时:");
do {
System.out.println("num = " + num); // 会执行一次
num++;
} while (num < 5); // 条件为 false
// 菜单选择
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.println("0. 退出");
// System.out.print("请选择: ");
// choice = scanner.nextInt();
//
// switch (choice) {
// case 1: System.out.println("执行新建操作"); break;
// case 2: System.out.println("执行打开操作"); break;
// case 3: System.out.println("执行保存操作"); break;
// case 0: System.out.println("退出程序"); break;
// default: System.out.println("无效选择");
// }
// } while (choice != 0);
scanner.close();
}
}跳转语句
break 语句
break 用于跳出循环或 switch 语句。
java
public class BreakStatement {
public static void main(String[] args) {
// 跳出循环
System.out.println("break 示例:");
for (int i = 1; i <= 10; i++) {
if (i == 5) {
System.out.println("遇到 5,跳出循环");
break; // 跳出整个循环
}
System.out.println("i = " + i);
}
// 带标签的 break(跳出指定循环)
System.out.println("\n带标签的 break:");
outer:
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
if (i == 2 && j == 2) {
System.out.println("跳出外层循环");
break outer; // 跳出 outer 标签标记的循环
}
System.out.println("i = " + i + ", j = " + j);
}
}
// 查找第一个负数
int[] numbers = {3, 5, -2, 7, 1};
int index = -1;
for (int i = 0; i < numbers.length; i++) {
if (numbers[i] < 0) {
index = i;
break; // 找到第一个就停止
}
}
System.out.println("\n第一个负数的索引: " + index); // 2
}
}continue 语句
continue 用于跳过本次循环,继续下一次循环。
java
public class ContinueStatement {
public static void main(String[] args) {
// 跳过本次循环
System.out.println("continue 示例:");
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
continue; // 跳过偶数
}
System.out.println("奇数: " + i);
}
// 打印 1-100 中不是 3 的倍数的数
System.out.println("\n1-20 中不是 3 的倍数的数:");
for (int i = 1; i <= 20; i++) {
if (i % 3 == 0) {
continue; // 跳过 3 的倍数
}
System.out.print(i + " ");
}
System.out.println();
// 带标签的 continue
System.out.println("\n带标签的 continue:");
outer:
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
if (j == 2) {
continue outer; // 跳到外层循环的下一次迭代
}
System.out.println("i = " + i + ", j = " + j);
}
}
}
}return 语句
return 用于从方法中返回,可以携带返回值。
java
public class ReturnStatement {
public static void main(String[] args) {
// return 结束方法
System.out.println("程序开始");
int result = divide(10, 2);
System.out.println("10 / 2 = " + result);
result = divide(10, 0);
System.out.println("10 / 0 = " + result);
System.out.println("程序结束");
}
// 带返回值的方法
public static int divide(int a, int b) {
// 检查除数是否为 0
if (b == 0) {
System.out.println("除数不能为 0");
return 0; // 提前返回
}
return a / b;
}
// 无返回值的方法
public static void printInfo(String name) {
if (name == null || name.isEmpty()) {
return; // 提前结束方法
}
System.out.println("姓名: " + name);
}
}循环对比
| 特性 | for | while | do-while |
|---|---|---|---|
| 初始化位置 | 循环头部 | 循环外部 | 循环外部 |
| 条件检查 | 循环前 | 循环前 | 循环后 |
| 最少执行次数 | 0 次 | 0 次 | 1 次 |
| 适用场景 | 已知次数 | 未知次数,可能 0 次 | 至少执行 1 次 |
java
public class LoopComparison {
public static void main(String[] args) {
int n = 5;
// for 循环
System.out.println("for 循环:");
for (int i = 1; i <= n; i++) {
System.out.print(i + " ");
}
System.out.println();
// while 循环
System.out.println("\nwhile 循环:");
int i = 1;
while (i <= n) {
System.out.print(i + " ");
i++;
}
System.out.println();
// do-while 循环
System.out.println("\ndo-while 循环:");
int j = 1;
do {
System.out.print(j + " ");
j++;
} while (j <= n);
System.out.println();
// 当条件一开始就不满足时
int x = 10;
System.out.println("\n条件一开始就不满足:");
System.out.print("while: ");
while (x < 5) {
System.out.print(x + " "); // 不执行
}
System.out.println("(不输出)");
System.out.print("do-while: ");
do {
System.out.print(x + " "); // 执行一次
} while (x < 5);
System.out.println();
}
}实际应用示例
打印图形
java
public class PrintPatterns {
public static void main(String[] args) {
// 打印矩形
System.out.println("矩形:");
for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= 6; j++) {
System.out.print("* ");
}
System.out.println();
}
// 打印直角三角形
System.out.println("\n直角三角形:");
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= i; j++) {
System.out.print("* ");
}
System.out.println();
}
// 打印倒直角三角形
System.out.println("\n倒直角三角形:");
for (int i = 5; i >= 1; i--) {
for (int j = 1; j <= i; j++) {
System.out.print("* ");
}
System.out.println();
}
// 打印等腰三角形
System.out.println("\n等腰三角形:");
for (int i = 1; i <= 5; i++) {
// 打印空格
for (int j = 1; j <= 5 - i; j++) {
System.out.print(" ");
}
// 打印星号
for (int k = 1; k <= 2 * i - 1; k++) {
System.out.print("* ");
}
System.out.println();
}
// 打印菱形
System.out.println("\n菱形:");
int size = 5;
// 上半部分
for (int i = 1; i <= size; i++) {
for (int j = 1; j <= size - i; j++) {
System.out.print(" ");
}
for (int k = 1; k <= 2 * i - 1; k++) {
System.out.print("* ");
}
System.out.println();
}
// 下半部分
for (int i = size - 1; i >= 1; i--) {
for (int j = 1; j <= size - i; j++) {
System.out.print(" ");
}
for (int k = 1; k <= 2 * i - 1; k++) {
System.out.print("* ");
}
System.out.println();
}
}
}查找和排序
java
public class SearchAndSort {
public static void main(String[] args) {
int[] arr = {64, 34, 25, 12, 22, 11, 90};
// 线性查找
int target = 25;
int index = -1;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == target) {
index = i;
break;
}
}
System.out.println("查找 " + target + ",索引: " + index);
// 冒泡排序
System.out.println("\n冒泡排序:");
System.out.println("排序前: " + java.util.Arrays.toString(arr));
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
// 交换
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
System.out.println("排序后: " + java.util.Arrays.toString(arr));
// 二分查找(需要有序数组)
target = 25;
int left = 0, right = arr.length - 1;
index = -1;
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] == target) {
index = mid;
break;
} else if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
System.out.println("\n二分查找 " + target + ",索引: " + index);
}
}小结
本章我们学习了:
- 条件语句:if-else、switch-case
- 循环语句:for、while、do-while、增强 for
- 跳转语句:break、continue、return
- 循环选择:根据场景选择合适的循环类型
下一章,我们将学习 方法,了解 Java 中方法的定义和使用。
