Skip to content

流程控制

流程控制语句用于控制程序的执行顺序。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);
    }
}

循环对比

特性forwhiledo-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 中方法的定义和使用。