4. Java 流程控制:顺序结构、分支结构与循环结构

4. Java 流程控制:顺序结构、分支结构与循环结构 一、概述三大流程控制结构Java 程序的执行流程由三种基本结构组成顺序结构、分支结构和循环结构。结构核心特点典型场景顺序结构代码按书写顺序从上到下依次执行无跳转变量赋值、连续输出、固定流程分支结构根据条件选择一条路径执行条件判断、多分支选择循环结构重复执行某段代码满足条件后停止批量处理、遍历数据二、顺序结构2.1 定义顺序结构是程序最基础的执行结构代码按照书写先后顺序从上到下依次执行。所有程序默认采用顺序结构。2.2 核心特点执行路径唯一不会跳过或重复某段代码先写的代码先执行后写的后执行分支结构和循环结构内部的代码也是顺序执行的2.3 代码示例public class Test { public static void main(String[] args) { System.out.println(努力做主人喜欢的事); System.out.println(大小姐驾到统统闪开); System.out.println(凛冬已至故乡的梅花开了吗); System.out.println(心怀不惧方能翱翔于天际); } }4 行输出按代码书写顺序依次打印不会乱序。三、分支结构分支结构根据条件表达式的布尔值选择一条执行路径。3.1 if 分支第一种格式语法结构if (关系表达式) { 语句体; }执行逻辑计算关系表达式的值若为true执行语句体若为false跳过语句体代码示例public class IfDemo { public static void main(String[] args) { boolean flag true; if (flag) { System.out.println(flag的值为true); } int number 20; if (number 10) { int a 100; System.out.println(number大于等于10); } } }注意事项规范项推荐写法不推荐写法大括号位置if (flag) {接在条件后大括号另起一行大括号省略始终保留大括号if (flag) System.out.println(...);布尔变量判断if (flag)if (flag true)语句体只有一行代码时大括号可省略但不建议省略后续添加代码时容易逻辑出错对boolean类型变量判断直接用变量名不使用 true/ false3.2 if-else 分支第二种格式语法结构if (关系表达式) { 语句体1; } else { 语句体2; }执行逻辑计算关系表达式的布尔值若为true执行语句体1若为false执行语句体2语句体1和语句体2必有且仅有一个被执行代码示例public class IfElseDemo { public static void main(String[] args) { // 判断奇偶 int num 7; if (num % 2 0) { System.out.println(num 是偶数); } else { System.out.println(num 是奇数); // 执行此分支 } // 判断及格 int score 85; if (score 60) { System.out.println(考试及格); // 执行此分支 } else { System.out.println(考试不及格); } } }输出7是奇数 考试及格三种 if 格式对比格式类型适用场景分支数量if第一种单条件场景1 个分支if-else第二种二选一场景2 个分支if-else if-else第三种多选一场景3 个及以上分支3.3 if-else if-else 分支第三种格式语法结构if (关系表达式1) { 语句体1; } else if (关系表达式2) { 语句体2; } else { 语句体n; }执行逻辑依次判断关系表达式1、2...的布尔值若某个表达式为true执行对应语句体后续分支不再判断若所有表达式均为false执行else对应的语句体最终仅有一个语句体被执行代码示例public class IfElseIfDemo { public static void main(String[] args) { int score 85; if (score 90) { System.out.println(成绩等级优秀); } else if (score 80) { System.out.println(成绩等级良好); // 命中此分支 } else if (score 60) { System.out.println(成绩等级及格); } else { System.out.println(成绩等级不及格); } } }注意事项分支顺序条件范围应从大到小或从特殊到一般排列否则会导致逻辑错误// 错误先判断 60后续 80 的条件永远不会命中 if (score 60) { ... } else if (score 80) { ... } // 正确从高到低排列 if (score 90) { ... } else if (score 80) { ... }else分支可省略但省略后若所有条件不满足则无任何输出3.4 switch 语句语法结构switch (表达式) { case 常量值1: 语句体1; break; case 常量值2: 语句体2; break; default: 语句体n; break; }核心规则规则项说明表达式类型byte/short/int/char/StringJDK7/ 枚举case 常量值必须唯一不可重复break执行完对应分支后跳出 switch省略会触发case 穿透default所有 case 不匹配时执行可放在任意位置习惯放在最后代码示例示例1基础用法int num 7; switch (num) { case 1: System.out.println(匹配到1); break; case 7: System.out.println(匹配到7); // 执行此分支 break; default: System.out.println(未匹配); break; }示例2case 穿透合理用法int month 3; switch (month) { case 3: case 4: case 5: System.out.println(春季); // 3/4/5 月均执行 break; case 6: case 7: case 8: System.out.println(夏季); break; }示例3JDK 14 switch 表达式int number 1; String result switch (number) { case 1 - 匹配到1; case 2 - 匹配到2; default - 未匹配; }; System.out.println(result); // 多行语句体使用 yield 返回值 String multi switch (number) { case 1 - { System.out.println(执行多行逻辑); yield 匹配到1; } default - 未匹配; };switch 与 if-else if 对比特性switchif-else if适用场景多条件等值匹配多条件范围/等值匹配可读性等值匹配时更简洁范围匹配时更灵活条件类型int/String等有限类型任意布尔表达式常见错误错误原因解决Duplicate branch in switch存在重复的 case 常量值确保每个 case 值唯一类型不匹配case 常量值与表达式类型不一致统一两者类型case 穿透导致逻辑错误省略了必要的 break在需要结束的分支后添加 break四、循环结构4.1 for 循环语法结构for (初始化表达式; 条件判断表达式; 递增/递减表达式) { // 循环体 }初始化表达式循环开始前执行一次定义循环变量条件判断表达式每次循环前判断true则执行循环体false则结束递增/递减表达式每次循环体执行后执行代码示例// 打印 1~5 for (int i 1; i 5; i) { System.out.println(当前数字 i); }增强 for 循环foreachJDK 5String[] fruits {苹果, 香蕉, 橙子}; for (String fruit : fruits) { System.out.println(水果 fruit); }注意事项循环变量的作用域仅在 for 循环体内增强 for 循环无法修改数组/集合的元素仅能读取三个表达式均可省略for(;;)为无限循环需手动 break4.2 while 循环语法结构初始化语句; while (布尔条件表达式) { 循环体语句; 迭代语句; }执行逻辑执行初始化语句判断条件表达式true→ 执行循环体 → 执行迭代 → 再次判断false→ 终止循环循环体可能一次都不执行代码示例int i 1; while (i 5) { System.out.println(i); i; } // 输出1 2 3 4 54.3 do-while 循环语法结构初始化语句; do { 循环体语句; 迭代语句; } while (布尔条件表达式); // 末尾必须加分号执行逻辑执行初始化语句先执行循环体 → 执行迭代 → 判断条件循环体至少执行一次唯一区别于 while 的点代码示例// 条件不满足仍执行一次 int i 6; do { System.out.println(i); // 输出6 i; } while (i 5);while vs do-while 对比特性whiledo-while执行顺序先判断后执行先执行后判断最少执行次数0 次1 次语法结尾无需分号必须加分号适用场景不确定是否需执行循环至少需执行一次循环核心避坑问题原因解决无限循环死循环迭代语句缺失条件永远为true确保迭代语句让条件最终为falsedo-while 漏分号末尾缺少;while (条件);循环变量作用域混淆变量在循环内部定义注意变量定义位置与作用范围4.4 无限循环无限循环指循环条件永远为true需手动终止break/return/ 异常 / 外部标志位否则程序永久运行。三种写法写法可读性使用频率while (true) { ... }最高最常用do { ... } while (true);中等至少执行一次时使用for (;;) { ... }最低极简写法示例while(true) breakimport java.util.Scanner; public class MenuDemo { public static void main(String[] args) { Scanner sc new Scanner(System.in); while (true) { System.out.println( 菜单 ); System.out.println(1. 查看信息); System.out.println(0. 退出程序); System.out.print(请输入指令); int choice sc.nextInt(); if (choice 0) { System.out.println(程序退出); break; // 手动终止无限循环 } switch (choice) { case 1: System.out.println(用户ID1001); break; default: System.out.println(无效指令); } } sc.close(); } }终止方式方式语法效果breakbreak;终止当前循环returnreturn;/return 值;结束整个方法连带终止循环标志位volatile boolean flag多线程中外部控制终止注意事项必须包含终止逻辑if break否则为纯死循环终止条件必须可达避免永不满足的终止判断do-while 末尾必须加分号多线程中标志位需加volatile保证可见性五、跳转控制语句跳转控制语句用于改变程序执行流程Java 中常用break、continue、return三种。5.1 break 语句定义强制终止当前所在的循环或 switch 语句跳出到语句块外部继续执行。使用场景场景1终止循环// 找到第一个能被3整除的数后终止 for (int i 1; i 10; i) { if (i % 3 0) { System.out.println(找到 i); break; // 终止 for 循环 } System.out.println(当前数字 i); } // 输出当前数字1 当前数字2 找到3场景2终止 switch避免穿透switch (choice) { case 1: System.out.println(选择了1); break; // 终止 switch case 2: System.out.println(选择了2); break; }场景3带标签终止外层循环outer: for (int i 1; i 3; i) { for (int j 1; j 3; j) { if (j 2) { break outer; // 终止 outer 标记的外层循环 } System.out.println(i i , j j); } } // 输出i1, j15.2 continue 语句定义跳过当前循环的剩余代码直接进入下一次循环的条件判断不终止循环。代码示例// 跳过偶数只打印奇数 for (int i 1; i 5; i) { if (i % 2 0) { continue; // 跳过本次剩余代码 } System.out.println(奇数 i); } // 输出奇数1 奇数3 奇数5带标签跳过外层循环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); } } // 输出i1,j1 i2,j1 i3,j15.3 return 语句定义结束当前方法并可选择返回一个值。return之后的方法内代码不可达。使用场景场景1返回值并结束方法public static int add(int a, int b) { return a b; // 返回结果结束方法 }场景2void 方法中提前终止public static void checkAge(int age) { if (age 18) { System.out.println(未满18岁无法操作); return; // 提前结束方法 } System.out.println(已成年操作成功); }场景3循环中用 return 结束方法public static void findTarget(int[] arr, int target) { for (int num : arr) { if (num target) { System.out.println(找到目标数 target); return; // 结束方法循环连带终止 } } System.out.println(未找到目标数); }5.4 三大跳转语句对比语句作用范围核心效果适用场景break当前循环/switch终止当前语句块提前终止循环、避免 switch 穿透continue当前循环跳过本次进入下一次过滤循环中特定条件return当前方法结束方法可返回值返回结果、提前结束方法5.5 break 与 return 核心区别维度breakreturn作用范围当前循环/switch 语句块整个方法对后续代码的影响方法内循环外的代码继续执行循环外的代码不再执行能否返回值否是非void方法// break循环外代码仍执行 for (int i 1; i 5; i) { if (i 3) break; System.out.println(i i); } System.out.println(break后方法仍在执行); // 会执行 // return循环外代码不执行 for (int i 1; i 5; i) { if (i 3) return; System.out.println(i i); } System.out.println(这行不会执行); // 不会执行六、综合示例三种结构联用public class FlowControlDemo { public static void main(String[] args) { // 循环结构重复5天 for (int day 1; day 5; day) { System.out.println(第 day 天放学了); // 顺序结构按顺序执行 System.out.println(开门); System.out.println(放下书包); // 分支结构判断条件 boolean hasHomework true; if (hasHomework) { System.out.println(写作业); } else { System.out.println(看动画片); } System.out.println(----------); } } }