Java基础全套教程(三)—— 控制语句、方法、递归算法
Java基础全套教程(三)—— 控制语句、方法、递归算法
本章是Java编程从基础语法走向逻辑编程的核心转折点。前面我们学习了变量、数据类型、运算符,只能实现简单的顺序执行代码。而真正的程序,需要具备判断能力、重复执行能力、代码复用能力。
所有软件、系统、项目的底层逻辑,全部由三种流程结构 + 方法封装 + 递归思想构成。学好本章,才算真正具备写逻辑代码的能力,是入门编程的核心门槛。
3.1 程序三大执行流程
Java程序的执行顺序只有三种结构,所有复杂逻辑都是这三种结构的组合嵌套:
3.1.1 顺序结构
代码默认执行方式:从上往下、逐行执行、无跳转、无重复。简单的赋值、打印、运算都属于顺序结构。
3.1.2 选择结构(分支结构)
根据条件真假,选择性执行部分代码。核心思想:满足条件才执行,不满足则跳过或走其他分支。用于处理判断、筛选、状态区分场景。
3.1.3 循环结构
满足条件时,重复执行一段代码,直到条件不成立为止。用于批量处理、重复运算、遍历数据等场景。
3.2 选择结构详解(if / switch)
3.2.1 if 单分支结构
语法规则:仅在条件为 true 时执行代码块,条件为 false 直接跳过。
if(布尔表达式){// 条件成立才执行}开发强制规范:
无论语句块只有一行还是多行,必须加大括号;
不加大括号仅对下一行生效,极易产生隐藏bug。
全新示例:随机幸运数字判断
程序随机生成一个1~10的数字,判断是否为幸运数字(7、8、9为幸运)
publicclassLuckyNumTest{publicstaticvoidmain(String[]args){// 生成1~10随机整数intnum=(int)(Math.random()*10)+1;if(num>=7){System.out.println("本次随机数:"+num+",恭喜!今日幸运数字!");}if(num<7){System.out.println("本次随机数:"+num+",平常心,下次更好!");}}}3.2.2 if-else 双分支结构
语法逻辑:二选一执行,条件成立执行前者,不成立执行后者,必然执行其中一块。
if(布尔表达式){// 成立执行}else{// 不成立执行}全新示例:体重标准判断
随机生成体重数值,判断是否属于标准体重范围
publicclassWeightJudgeTest{publicstaticvoidmain(String[]args){// 随机生成40~80kg体重doubleweight=40+Math.random()*40;System.out.println("当前体重:"+String.format("%.1f",weight)+"kg");// 假设60-70为标准体重if(weight>=60&&weight<=70){System.out.println("体重达标,身材标准!");}else{System.out.println("体重不在标准范围,记得合理运动!");}}}拓展:三元运算符替代双分支
publicclassTernaryTest{publicstaticvoidmain(String[]args){intscore1=76;intscore2=89;// 获取两个分数中的较高值intmaxScore=score1>score2?score1:score2;System.out.println("最高分:"+maxScore);}}3.2.3 if-else if-else 多分支结构
用于多区间、多等级判断,从上到下依次匹配,匹配成功立即结束分支,所有条件不匹配则走else默认分支。
全新示例:考试分数等级评定
随机生成0~100分数,按学业等级划分评级
publicclassScoreLevelTest{publicstaticvoidmain(String[]args){intscore=(int)(Math.random()*101);System.out.println("考试分数:"+score);if(score>=90){System.out.println("评级:优秀A+");}elseif(score>=80){System.out.println("评级:良好A");}elseif(score>=70){System.out.println("评级:中等B");}elseif(score>=60){System.out.println("评级:及格C");}else{System.out.println("评级:不及格D,需要补考");}}}3.2.4 switch 多值匹配结构
switch 适合固定等值匹配,不适合区间判断,执行效率高于if多分支。
支持类型:byte、short、int、char、String、枚举
核心特点:缺少break会发生case穿透
全新示例1:星期日程匹配
publicclassSwitchWeekTest{publicstaticvoidmain(String[]args){intweek=3;switch(week){case1:System.out.println("周一:晨会日,梳理本周计划");break;case2:System.out.println("周二:技术学习日");break;case3:System.out.println("周三:项目实战日");break;case4:System.out.println("周四:代码复盘日");break;case5:System.out.println("周五:总结归档日");break;case6:case7:System.out.println("周末:休息充电");break;default:System.out.println("星期参数错误");}}}全新示例2:String字符串匹配(JDK7+)
publicclassSwitchStringTest{publicstaticvoidmain(String[]args){Stringfruit="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("未知水果");}}}3.3 循环结构详解
3.3.1 while 循环(先判断、后执行)
条件不成立则一次都不执行,适合未知循环次数场景。
全新示例:计算1~100偶数总和
publicclassWhileEvenSumTest{publicstaticvoidmain(String[]args){inti=1;intevenSum=0;while(i<=100){if(i%2==0){evenSum+=i;}i++;}System.out.println("1~100偶数总和:"+evenSum);}}3.3.2 do-while 循环(先执行、后判断)
至少执行一次,适合人机交互、输入校验场景。
全新示例:模拟签到打卡(至少提示一次)
publicclassDoWhileSignTest{publicstaticvoidmain(String[]args){intcount=1;do{System.out.println("今日第"+count+"次打卡成功");count++;}while(count<=3);}}3.3.3 for 循环(开发首选)
结构紧凑、变量作用域可控,适合已知循环次数场景。
全新示例:输出1~100所有能被4整除的数
publicclassForFourTest{publicstaticvoidmain(String[]args){System.out.println("1~100能被4整除的数:");for(inti=1;i<=100;i++){if(i%4==0){System.out.print(i+" ");}}}}3.3.4 嵌套循环
外层控行、内层控列,用于打印图形、批量双层遍历。
全新示例:打印6行6列星号矩阵
publicclassNestMatrixTest{publicstaticvoidmain(String[]args){for(inti=0;i<6;i++){for(intj=0;j<6;j++){System.out.print("* ");}System.out.println();}}}全新九九乘法表(排版优化版)
publicclassMultiTableTest{publicstaticvoidmain(String[]args){for(introw=1;row<=9;row++){for(intcol=1;col<=row;col++){System.out.printf("%d*%d=%-2d ",col,row,row*col);}System.out.println();}}}3.3.5 break 与 continue
break:终止当前整个循环
continue:跳过本次,直接进入下一次循环
全新break示例:寻找第一个能被7整除的数
publicclassBreakSevenTest{publicstaticvoidmain(String[]args){for(inti=10;i<50;i++){if(i%7==0){System.out.println("找到目标数:"+i);break;}}}}全新continue示例:跳过偶数,只输出奇数
publicclassContinueOddTest{publicstaticvoidmain(String[]args){for(inti=1;i<=30;i++){if(i%2==0){continue;}System.out.print(i+" ");}}}3.4 方法(代码复用核心)
方法是具备独立功能的代码块,可以重复调用,解决代码冗余、杂乱问题,是面向对象的基础。
3.4.1 方法语法格式
修饰符 返回值类型 方法名(形参列表){方法体return返回值;}3.4.2 基础方法示例(全新案例)
定义方法实现「计算两数乘积」和「打印欢迎语」
publicclassMethodBaseTest{publicstaticvoidmain(String[]args){// 调用方法printWelcome();intres=getMultiply(9,7);System.out.println("两数乘积结果:"+res);}// 无参无返回值publicstaticvoidprintWelcome(){System.out.println("欢迎使用方法工具类!");}// 有参有返回值publicstaticintgetMultiply(inta,intb){returna*b;}}3.4.3 方法重载
同一个类中,方法名相同、参数列表不同(个数/类型/顺序),与返回值、参数名无关。
全新重载示例:多类型求和工具
publicclassOverloadTest{publicstaticvoidmain(String[]args){System.out.println("两整数和:"+sum(12,23));System.out.println("三整数和:"+sum(11,22,33));System.out.println("浮点和:"+sum(2.5,3.6));}publicstaticintsum(inta,intb){returna+b;}publicstaticintsum(inta,intb,intc){returna+b+c;}publicstaticdoublesum(doublea,doubleb){returna+b;}}重载误区总结:仅返回值不同、仅参数名不同,都不构成重载。
3.4.4 实战方法案例:考勤罚款系统(全新逻辑)
publicclassAttendFineTest{publicstaticvoidmain(String[]args){doublefine=calcFine(25,8000);System.out.println("本次迟到罚款:"+fine+"元");}publicstaticdoublecalcFine(intlateMin,doublemonthSalary){doublefineMoney=0;doubledaySalary=monthSalary/21.75;if(lateMin<=5){System.out.println("轻微迟到,口头警告");}elseif(lateMin<=15){fineMoney=50;}elseif(lateMin<=30){fineMoney=150;}elseif(lateMin<60){fineMoney=daySalary/2;}else{fineMoney=daySalary*2;}returnfineMoney;}}3.5 递归算法
递归核心:方法自己调用自己,适合拆解重复性子问题,常用于数学运算、遍历、搜索算法。
递归必备两点:递归头(终止条件)、递归体(递推逻辑)
全新示例:递归计算累加 1~n
publicclassRecursionSumTest{publicstaticvoidmain(String[]args){intresult=getTotal(50);System.out.println("1~50累加结果:"+result);}publicstaticintgetTotal(intn){// 递归头if(n==1){return1;}// 递归体returnn+getTotal(n-1);}}递归优缺点:代码简洁优雅,但会占用栈内存,层数过多容易栈溢出,复杂场景优先循环。
本章核心知识点总结
程序三大结构:顺序、选择、循环,覆盖所有编程逻辑;
if 适合区间判断,switch 适合固定值匹配,注意 case 穿透问题;
while先判后执行、do-while至少执行一次、for循环为开发首选;
break结束整体循环,continue跳过本次循环;
方法实现代码复用,重载提升方法兼容性;
递归核心是自己调用自己,必须设置终止条件,慎用深层递归。
