MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

Java中控制流语句的深入解析

2022-07-065.4k 阅读

Java 控制流语句概述

在 Java 编程中,控制流语句起着至关重要的作用。它们允许程序员改变程序执行的顺序,根据不同的条件执行不同的代码块,或者重复执行特定的代码段。Java 中的控制流语句主要分为条件语句、循环语句和跳转语句这几大类。通过合理运用这些控制流语句,程序员能够编写出更加灵活、高效且逻辑严密的程序。

条件语句

if - else 语句

  1. 基本语法 if - else 语句是最常见的条件语句,用于根据条件的真假来决定执行哪一段代码。其基本语法如下:
if (condition) {
    // 如果条件为真,执行这里的代码
} else {
    // 如果条件为假,执行这里的代码
}

其中,condition 是一个布尔表达式,其结果要么为 true,要么为 false。当 conditiontrue 时,执行 if 块中的代码;当 conditionfalse 时,执行 else 块中的代码。

  1. 示例 下面是一个简单的示例,用于判断一个整数是否为正数:
public class IfElseExample {
    public static void main(String[] args) {
        int number = 10;
        if (number > 0) {
            System.out.println(number + " 是正数");
        } else {
            System.out.println(number + " 不是正数");
        }
    }
}

在这个示例中,变量 number 的值为 10,number > 0 这个条件为 true,因此会执行 if 块中的代码,输出 “10 是正数”。

  1. 多重 if - else 结构 有时候,我们需要根据多个条件进行判断,可以使用多重 if - else 结构,其语法如下:
if (condition1) {
    // 如果 condition1 为真,执行这里的代码
} else if (condition2) {
    // 如果 condition1 为假且 condition2 为真,执行这里的代码
} else {
    // 如果所有条件都为假,执行这里的代码
}

例如,判断一个学生的成绩等级:

public class GradeEvaluation {
    public static void main(String[] args) {
        int score = 85;
        if (score >= 90) {
            System.out.println("成绩等级为 A");
        } else if (score >= 80) {
            System.out.println("成绩等级为 B");
        } else if (score >= 70) {
            System.out.println("成绩等级为 C");
        } else {
            System.out.println("成绩等级为 D");
        }
    }
}

这里根据成绩 score 的不同范围,输出不同的成绩等级。

  1. 嵌套 if - else 语句 在一个 if - else 语句的 if 块或 else 块中,还可以再嵌套 if - else 语句,形成嵌套结构。例如:
public class NestedIfElseExample {
    public static void main(String[] args) {
        int age = 25;
        boolean isStudent = true;
        if (age >= 18) {
            if (isStudent) {
                System.out.println("你是一名成年学生");
            } else {
                System.out.println("你是一名成年人,但不是学生");
            }
        } else {
            System.out.println("你是未成年人");
        }
    }
}

在这个例子中,先判断年龄是否大于等于 18,然后在满足这个条件的基础上,再判断是否是学生,从而输出不同的信息。

switch - case 语句

  1. 基本语法 switch - case 语句用于基于一个表达式的值来执行多个分支之一。其基本语法如下:
switch (expression) {
    case value1:
        // 如果 expression 的值等于 value1,执行这里的代码
        break;
    case value2:
        // 如果 expression 的值等于 value2,执行这里的代码
        break;
    default:
        // 如果 expression 的值与所有 case 的值都不匹配,执行这里的代码
}

其中,expression 必须是一个可以求值为 byteshortcharintenum 类型或 String 类型的表达式。case 后面的值必须是与 expression 类型兼容的常量表达式。

  1. 示例 下面是一个根据星期几的数字来输出星期几名称的示例:
public class SwitchCaseExample {
    public static void main(String[] args) {
        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("无效的数字");
        }
    }
}

在这个示例中,day 的值为 3,因此会执行 case 3 后面的代码,输出 “星期三”。

  1. fall - through 现象switch - case 语句中,如果 case 分支没有 break 语句,就会发生 fall - through 现象,即程序会继续执行下一个 case 分支的代码,直到遇到 break 或者 switch 语句结束。例如:
public class FallThroughExample {
    public static void main(String[] args) {
        int num = 2;
        switch (num) {
            case 1:
                System.out.println("数字是 1");
            case 2:
                System.out.println("数字是 2");
            case 3:
                System.out.println("数字是 3");
                break;
            default:
                System.out.println("其他数字");
        }
    }
}

在这个例子中,num 的值为 2,由于 case 2 没有 break 语句,程序会继续执行 case 3 的代码,最终输出 “数字是 2” 和 “数字是 3”。在实际编程中,fall - through 现象通常是需要避免的,除非有特殊的逻辑需求。

  1. 使用 String 类型的 switch - case 从 Java 7 开始,switch - case 语句支持 String 类型。例如:
public class StringSwitchCaseExample {
    public static void main(String[] args) {
        String fruit = "apple";
        switch (fruit) {
            case "apple":
                System.out.println("这是苹果");
                break;
            case "banana":
                System.out.println("这是香蕉");
                break;
            case "orange":
                System.out.println("这是橙子");
                break;
            default:
                System.out.println("未知的水果");
        }
    }
}

这里根据 fruit 字符串的值来执行不同的分支。

循环语句

for 循环

  1. 基本语法 for 循环用于重复执行一段代码,它有一个初始化部分、一个条件判断部分和一个迭代部分。其基本语法如下:
for (initialization; condition; iteration) {
    // 循环体,重复执行的代码
}

其中,initialization 通常用于初始化循环变量,condition 是一个布尔表达式,用于判断是否继续循环,iteration 用于更新循环变量。

  1. 示例 下面是一个简单的 for 循环示例,用于计算 1 到 10 的整数之和:
public class ForLoopExample {
    public static void main(String[] args) {
        int sum = 0;
        for (int i = 1; i <= 10; i++) {
            sum += i;
        }
        System.out.println("1 到 10 的整数之和为:" + sum);
    }
}

在这个示例中,int i = 1 是初始化部分,i <= 10 是条件判断部分,i++ 是迭代部分。每次循环时,i 的值会增加 1,直到 i 大于 10 时,循环结束。

  1. 嵌套 for 循环 在一个 for 循环的循环体中,可以再嵌套一个 for 循环,形成嵌套结构。常用于处理二维数组或需要进行多层循环的场景。例如,打印一个九九乘法表:
public class MultiplicationTable {
    public static void main(String[] args) {
        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();
        }
    }
}

这里外层 for 循环控制行数,内层 for 循环控制每行的乘法表达式数量。

  1. 增强 for 循环(for - each 循环) 增强 for 循环是 Java 5.0 引入的一种更简洁的遍历数组或集合的方式。其语法如下:
for (elementType element : arrayOrCollection) {
    // 对 element 进行操作
}

其中,elementType 是数组或集合中元素的类型,element 是每次迭代取出的元素,arrayOrCollection 是要遍历的数组或集合。

例如,遍历一个整数数组并输出每个元素:

public class EnhancedForLoopExample {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3, 4, 5};
        for (int number : numbers) {
            System.out.println(number);
        }
    }
}

增强 for 循环在遍历数组或集合时更加简洁,但它不能用于在遍历过程中修改数组或集合的元素(除了对象数组中对象的内部状态),也不能获取当前元素的索引。

while 循环

  1. 基本语法 while 循环会在指定条件为 true 时重复执行一段代码。其基本语法如下:
while (condition) {
    // 循环体,当 condition 为 true 时执行
}

其中,condition 是一个布尔表达式,在每次循环开始时会检查这个条件。如果条件为 true,则执行循环体中的代码;如果条件为 false,则循环结束。

  1. 示例 下面是一个使用 while 循环计算 1 到 100 的偶数之和的示例:
public class WhileLoopExample {
    public static void main(String[] args) {
        int sum = 0;
        int number = 2;
        while (number <= 100) {
            sum += number;
            number += 2;
        }
        System.out.println("1 到 100 的偶数之和为:" + sum);
    }
}

在这个示例中,number <= 100 是条件判断部分,每次循环时 number 的值增加 2,直到 number 大于 100 时,循环结束。

  1. 注意事项 在使用 while 循环时,一定要确保条件最终会变为 false,否则会导致无限循环。例如,下面的代码会导致无限循环:
public class InfiniteLoopExample {
    public static void main(String[] args) {
        while (true) {
            System.out.println("这是一个无限循环");
        }
    }
}

在实际编程中,无限循环通常用于需要持续运行的程序,如服务器程序,但一般需要配合其他逻辑来控制何时退出循环。

do - while 循环

  1. 基本语法 do - while 循环与 while 循环类似,但它会先执行一次循环体,然后再检查条件。其基本语法如下:
do {
    // 循环体,先执行一次
} while (condition);

其中,condition 是一个布尔表达式,在每次循环结束后会检查这个条件。如果条件为 true,则继续执行循环体;如果条件为 false,则循环结束。

  1. 示例 下面是一个使用 do - while 循环让用户输入一个正数的示例:
import java.util.Scanner;

public class DoWhileLoopExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int number;
        do {
            System.out.print("请输入一个正数:");
            number = scanner.nextInt();
        } while (number <= 0);
        System.out.println("你输入的正数是:" + number);
        scanner.close();
    }
}

在这个示例中,无论用户第一次输入什么值,程序都会先执行一次循环体,提示用户输入一个正数。然后检查输入的数是否小于等于 0,如果是,则继续循环,直到用户输入一个正数为止。

  1. 与 while 循环的区别 while 循环是先判断条件再执行循环体,而 do - while 循环是先执行循环体再判断条件。这意味着 do - while 循环的循环体至少会执行一次,而 while 循环在条件一开始就为 false 的情况下,循环体一次都不会执行。例如:
public class WhileVsDoWhile {
    public static void main(String[] args) {
        int num = 10;
        while (num < 5) {
            System.out.println("while 循环体执行");
            num++;
        }

        do {
            System.out.println("do - while 循环体执行");
            num++;
        } while (num < 5);
    }
}

在这个例子中,while 循环由于条件 num < 5 一开始就为 false,循环体不会执行;而 do - while 循环会先执行一次循环体,然后再判断条件,所以会输出一次 “do - while 循环体执行”。

跳转语句

break 语句

  1. 在循环中使用 break break 语句用于终止当前循环(forwhiledo - while),跳出循环体,继续执行循环后面的代码。例如:
public class BreakInLoopExample {
    public static void main(String[] args) {
        for (int i = 1; i <= 10; i++) {
            if (i == 5) {
                break;
            }
            System.out.println(i);
        }
        System.out.println("循环结束后执行的代码");
    }
}

在这个示例中,当 i 的值为 5 时,执行 break 语句,循环终止,程序会接着执行循环后面的 “循环结束后执行的代码”。因此,输出结果为 1 到 4,然后输出 “循环结束后执行的代码”。

  1. 在 switch - case 中使用 breakswitch - case 语句中,break 语句用于终止当前 switch 块,防止 fall - through 现象。前面已经介绍过相关示例,这里不再赘述。

  2. 带标签的 break 在嵌套循环中,如果需要从外层循环终止,可以使用带标签的 break。语法如下:

label: for (int i = 0; i < 5; i++) {
    for (int j = 0; j < 5; j++) {
        if (i * j > 6) {
            break label;
        }
        System.out.println(i + " * " + j + " = " + (i * j));
    }
}

在这个例子中,label 是自定义的标签,当 i * j > 6 时,执行 break label,会跳出外层的 for 循环,而不仅仅是内层的 for 循环。

continue 语句

  1. 在循环中使用 continue continue 语句用于跳过当前循环体中剩余的代码,直接开始下一次循环。例如:
public class ContinueInLoopExample {
    public static void main(String[] args) {
        for (int i = 1; i <= 10; i++) {
            if (i % 2 == 0) {
                continue;
            }
            System.out.println(i);
        }
    }
}

在这个示例中,当 i 是偶数时,执行 continue 语句,跳过 System.out.println(i) 这一行代码,直接开始下一次循环。因此,输出结果为 1、3、5、7、9。

  1. 带标签的 continue 与带标签的 break 类似,在嵌套循环中,带标签的 continue 可以用于跳到外层循环的下一次迭代。语法如下:
outer: for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        if (i + j > 2) {
            continue outer;
        }
        System.out.println(i + " + " + j + " = " + (i + j));
    }
}

在这个例子中,当 i + j > 2 时,执行 continue outer,会直接跳到外层 for 循环的下一次迭代,即 i 增加 1 并开始新的内层循环。

return 语句

  1. 在方法中使用 return return 语句用于从方法中返回一个值(如果方法有返回类型),或者终止一个无返回类型(void)的方法。例如:
public class ReturnExample {
    public static int add(int a, int b) {
        return a + b;
    }

    public static void printMessage() {
        System.out.println("这是一个无返回值的方法");
        return;
    }

    public static void main(String[] args) {
        int result = add(3, 5);
        System.out.println("3 + 5 的结果是:" + result);
        printMessage();
    }
}

add 方法中,return a + b 返回两个数相加的结果。在 printMessage 方法中,return 语句用于终止方法的执行,即使在方法末尾没有 return 语句,方法执行到最后一行代码也会自动返回。

  1. 提前返回 return 语句还可以用于在方法中间提前返回,根据不同的条件结束方法的执行。例如:
public class EarlyReturnExample {
    public static int divide(int a, int b) {
        if (b == 0) {
            System.out.println("除数不能为 0");
            return -1; // 返回一个特殊值表示错误
        }
        return a / b;
    }

    public static void main(String[] args) {
        int result1 = divide(10, 2);
        System.out.println("10 / 2 的结果是:" + result1);
        int result2 = divide(5, 0);
        System.out.println("5 / 0 的结果是:" + result2);
    }
}

divide 方法中,如果 b 为 0,会提前返回 -1 并输出错误信息,不再执行除法运算。

通过深入理解和熟练运用 Java 中的这些控制流语句,程序员能够根据不同的业务需求,编写出逻辑清晰、高效运行的程序。无论是条件判断、循环迭代还是跳转控制,每一种控制流语句都有其独特的用途和应用场景,在实际编程中需要根据具体情况进行合理选择和组合。