news 2026/6/3 17:20:46

Java流程控制语句详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java流程控制语句详解

Java 流程控制语句详解:从条件判断到循环控制

学会流程控制,就等于学会了让程序"思考"和"重复"的能力。本文结合实际场景,带你逐个击破 Java 流程控制的核心语法。


一、if 条件语句

if 语句是流程控制的基础,让程序根据条件选择不同的执行路径。

1.1 基本形式

// 单分支if(条件){// 条件为真时执行}// 双分支if(条件){// 条件为真时执行}else{// 条件为假时执行}// 多分支if(条件1){// 条件1为真}elseif(条件2){// 条件2为真}else{// 以上都不满足}

1.2 实际场景:用户登录验证

publicclassLoginDemo{publicstaticvoidmain(String[]args){Stringusername="admin";Stringpassword="123456";if(username.isEmpty()||password.isEmpty()){System.out.println("用户名或密码不能为空!");}elseif(!username.equals("admin")){System.out.println("用户名不存在!");}elseif(!password.equals("123456")){System.out.println("密码错误!");}else{System.out.println("登录成功,欢迎回来!");}}}

1.3 注意事项

  • 条件表达式必须是布尔值,不像 C/C++ 可以用整数代替。
  • 即使只有一行代码,也建议加上大括号{},避免维护时出错。

二、switch 语句

switch 适合对一个变量进行多值匹配,比一长串 else-if 更清晰。

2.1 基本语法

switch(变量){case1:// 匹配值1时执行break;case2:// 匹配值2时执行break;default:// 以上都不匹配时执行break;}

2.2 实际场景:电商订单状态机

publicclassOrderStatusDemo{publicstaticvoidmain(String[]args){intstatus=3;// 订单状态码switch(status){case0:System.out.println("待支付 - 请尽快完成付款");break;case1:System.out.println("已支付 - 商家正在备货");break;case2:System.out.println("已发货 - 快递正在路上");break;case3:System.out.println("已送达 - 请确认收货");break;case4:System.out.println("已完成 - 感谢您的购买");break;default:System.out.println("未知状态,请联系客服");break;}}}

2.3 实际场景:根据星期几安排工作(Java 14+ 增强 switch)

// Java 14 引入的 switch 表达式,更简洁Stringday="周三";Stringtask=switch(day){case"周一"->"制定本周计划";case"周二","周三","周四"->"专注开发";case"周五"->"代码评审 & 周报";case"周六"->"技术充电";case"周日"->"休息";default->"无效日期";};System.out.println(task);// 输出:专注开发

2.4 注意事项

  • 支持的数据类型:byteshortintcharString(Java 7+)、枚举。
  • 不要忘记 break!否则会发生"穿透"(fall-through),即继续执行下一个 case 的代码。
  • Java 14+ 的箭头语法->天然避免穿透问题。

三、for 循环

for 循环是已知循环次数时的首选。

3.1 经典 for 循环

for(初始化;条件;更新){// 循环体}
实际场景:计算1到100的累计和
publicclassSumDemo{publicstaticvoidmain(String[]args){intsum=0;for(inti=1;i<=100;i++){sum+=i;}System.out.println("1到100的和 = "+sum);// 5050}}

3.2 增强 for 循环(for-each)

遍历集合或数组时更简洁,不需要手动管理索引。

for(元素类型 变量:数组或集合){// 循环体}
实际场景:统计学生成绩
publicclassScoreDemo{publicstaticvoidmain(String[]args){int[]scores={92,85,78,96,63,88};inttotal=0;intexcellent=0;for(intscore:scores){total+=score;if(score>=90){excellent++;}}doubleaverage=(double)total/scores.length;System.out.printf("平均分:%.1f,优秀人数:%d\n",average,excellent);// 输出:平均分:83.7,优秀人数:2}}

3.3 注意事项

  • 经典 for 适合需要索引的场景;for-each 适合只读遍历
  • for-each 中不能修改数组/集合的引用,也不能获取当前索引。

四、嵌套循环

嵌套循环就是循环里面套循环,常用于处理二维结构(表格、矩阵、图形)。

4.1 实际场景:打印九九乘法表

publicclassMultiplicationTable{publicstaticvoidmain(String[]args){for(inti=1;i<=9;i++){for(intj=1;j<=i;j++){System.out.printf("%d×%d=%-4d",j,i,i*j);}System.out.println();// 换行}}}

输出:

1×1=1 1×2=2 2×2=4 1×3=3 2×3=6 3×3=9 ...(以此类推) 1×9=9 2×9=18 3×9=27 ... 9×9=81

4.2 实际场景:遍历二维数组(课程表)

publicclassCourseTable{publicstaticvoidmain(String[]args){String[][]schedule={{"语文","数学","英语","体育","美术"},{"数学","英语","语文","音乐","体育"},{"英语","语文","数学","美术","音乐"}};String[]days={"周一","周二","周三"};for(inti=0;i<schedule.length;i++){System.out.print(days[i]+":");for(intj=0;j<schedule[i].length;j++){System.out.print(schedule[i][j]+"\t");}System.out.println();}}}

4.3 注意事项

  • 嵌套层数建议不超过 3 层,否则可读性急剧下降。
  • 内层循环的执行次数 = 外层次数 × 内层次数,注意性能。

五、break 和 continue

这两个关键字用于在循环中进行流程干预

5.1 break:立即跳出循环

break 会终止当前所在的循环,程序跳到循环之后继续执行。

实际场景:在数组中查找目标元素
publicclassSearchDemo{publicstaticvoidmain(String[]args){int[]data={12,45,7,89,33,67};inttarget=89;intindex=-1;for(inti=0;i<data.length;i++){if(data[i]==target){index=i;break;// 找到了就不再继续搜索}}if(index!=-1){System.out.println(target+" 在第 "+index+" 个位置");}else{System.out.println("未找到 "+target);}}}
带标签的 break(跳出多层循环)
publicclassLabelBreakDemo{publicstaticvoidmain(String[]args){int[][]matrix={{1,2,3},{4,5,6},{7,8,9}};inttarget=5;outer:// 标签for(inti=0;i<matrix.length;i++){for(intj=0;j<matrix[i].length;j++){if(matrix[i][j]==target){System.out.printf("找到 %d,位置:[%d][%d]\n",target,i,j);breakouter;// 直接跳出外层循环}}}}}

5.2 continue:跳过本次,继续下一次

continue 不会终止循环,只是跳过当前这一轮剩下的代码,直接进入下一轮迭代。

实际场景:筛选有效数据(跳过空值)
publicclassFilterDemo{publicstaticvoidmain(String[]args){String[]inputs={"hello","","world",null,"java"," ","code"};for(Stringinput:inputs){// 跳过 null 和空白字符串if(input==null||input.trim().isEmpty()){continue;}System.out.println("处理数据:"+input);}}}

输出:

处理数据:hello 处理数据:world 处理数据:java 处理数据:code

5.3 break vs continue 对比

特性breakcontinue
作用终止整个循环跳过本轮,继续下一轮
循环是否继续
配合标签可跳出多层循环可跳到外层循环的下一次
典型场景找到目标即停止过滤不符合条件的数据

六、综合实战:学生成绩分析系统

把以上所有知识点串起来,实现一个完整的小程序:

publicclassGradeAnalyzer{publicstaticvoidmain(String[]args){String[]students={"张三","李四","王五","赵六","钱七"};int[][]scores={{85,92,78},// 张三:语、数、英{72,65,80},// 李四{95,88,92},// 王五{55,48,62},// 赵六{88,76,85}// 钱七};String[]subjects={"语文","数学","英语"};System.out.println("===== 学生成绩分析报告 =====\n");// 嵌套循环 + for-each:逐个学生分析for(inti=0;i<students.length;i++){inttotal=0;booleanhasFail=false;for(intj=0;j<scores[i].length;j++){total+=scores[i][j];// if 判断:是否有不及格科目if(scores[i][j]<60){hasFail=true;System.out.printf(" ⚠ %s 的%s不及格(%d分)\n",students[i],subjects[j],scores[i][j]);}}doubleaverage=(double)total/scores[i].length;// switch 判断等级Stringlevel;intlevelCode=(int)average/10;switch(levelCode){case10:case9:level="优秀";break;case8:level="良好";break;case7:level="中等";break;case6:level="及格";break;default:level="不及格";break;}// continue:跳过有不及格科目的学生的评优资格if(hasFail){System.out.printf("%s | 均分:%.1f | 等级:%s | ❌ 不参与评优\n",students[i],average,level);continue;}System.out.printf("%s | 均分:%.1f | 等级:%s | ✅ 可参与评优\n",students[i],average,level);}}}

运行结果:

===== 学生成绩分析报告 ===== 张三 | 均分:85.0 | 等级:良好 | ✅ 可参与评优 李四 | 均分:72.3 | 等级:中等 | ✅ 可参与评优 王五 | 均分:91.7 | 等级:优秀 | ✅ 可参与评优 ⚠ 赵六 的语文不及格(55分) ⚠ 赵六 的数学不及格(48分) 赵六 | 均分:55.0 | 等级:不及格 | ❌ 不参与评优 钱七 | 均分:83.0 | 等级:良好 | ✅ 可参与评优

七、总结速查表

语句核心用途何时选用
if / else if / else条件判断需要根据不同条件走不同逻辑
switch多值匹配一个变量有多个固定取值,比 else-if 更清晰
for已知次数的循环循环次数确定,需要索引控制
for-each遍历集合/数组只需读取元素,不关心索引
嵌套循环处理多维结构二维数据、图形输出等
break终止循环找到目标即停止,或跳出多层循环
continue跳过本轮过滤数据,跳过不需要处理的情况

💡学习建议:流程控制是编程的地基,多写小练习巩固手感。尝试用不同方式解决同一个问题(比如用 if 和 switch 分别实现),体会各自的优势。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/3 17:19:01

基于STM32与RFM95的LoRa无线通信系统DIY指南

1. 项目概述&#xff1a;从车库到公寓的无线警报如果你和我一样&#xff0c;住在公寓楼里&#xff0c;但车库在几百米开外的另一栋建筑&#xff0c;那么如何实时知道车库门是否被异常打开&#xff0c;就成了一个不大不小的痛点。拉网线不现实&#xff0c;Wi-Fi信号穿墙越栋后也…

作者头像 李华
网站建设 2026/6/3 17:17:06

用Python和Matlab搞定东南大学齿轮箱数据集:从数据读取到故障分类实战

东南大学齿轮箱数据集实战&#xff1a;Python与Matlab双视角解析引言&#xff1a;机械故障诊断的数据科学之旅机械故障诊断领域正经历着从传统经验判断向数据驱动决策的转变。东南大学齿轮箱数据集作为国内知名的开放研究资源&#xff0c;包含了轴承和齿轮两大类共10种故障状态…

作者头像 李华
网站建设 2026/6/3 17:16:27

QQ音乐API深度破解:逆向工程实战指南与3大加密机制技术解密

QQ音乐API深度破解&#xff1a;逆向工程实战指南与3大加密机制技术解密 【免费下载链接】MCQTSS_QQMusic QQ音乐解析 项目地址: https://gitcode.com/gh_mirrors/mc/MCQTSS_QQMusic 在当今数字音乐时代&#xff0c;QQ音乐作为国内领先的音乐平台&#xff0c;其API接口设…

作者头像 李华
网站建设 2026/6/3 17:16:15

B站视频下载终极指南:BilibiliDown免费跨平台工具完整教程

B站视频下载终极指南&#xff1a;BilibiliDown免费跨平台工具完整教程 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirro…

作者头像 李华