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为幸运)
public class LuckyNumTest {
public static void main(String[] args) {
// 生成1~10随机整数
int num = (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{
// 不成立执行
}
全新示例:体重标准判断
随机生成体重数值,判断是否属于标准体重范围
public class WeightJudgeTest {
public static void main(String[] args) {
// 随机生成40~80kg体重
double weight = 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("体重不在标准范围,记得合理运动!");
}
}
}
拓展:三元运算符替代双分支
public class TernaryTest {
public static void main(String[] args) {
int score1 = 76;
int score2 = 89;
// 获取两个分数中的较高值
int maxScore = score1 > score2 ? score1 : score2;
System.out.println("最高分:" + maxScore);
}
}
3.2.3 if-else if-else 多分支结构
用于多区间、多等级判断,从上到下依次匹配,匹配成功立即结束分支,所有条件不匹配则走else默认分支。
全新示例:考试分数等级评定
随机生成0~100分数,按学业等级划分评级
public class ScoreLevelTest {
public static void main(String[] args) {
int score = (int)(Math.random() * 101);
System.out.println("考试分数:" + score);
if(score >= 90){
System.out.println("评级:优秀A+");
}else if(score >= 80){
System.out.println("评级:良好A");
}else if(score >= 70){
System.out.println("评级:中等B");
}else if(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:星期日程匹配
public class SwitchWeekTest {
public static void main(String[] args) {
int week = 3;
switch (week){
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:
case 7:
System.out.println("周末:休息充电");
break;
default:
System.out.println("星期参数错误");
}
}
}
全新示例2:String字符串匹配(JDK7+)
public class SwitchStringTest {
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("未知水果");
}
}
}
3.3 循环结构详解
3.3.1 while 循环(先判断、后执行)
条件不成立则一次都不执行,适合未知循环次数场景。
全新示例:计算1~100偶数总和
public class WhileEvenSumTest {
public static void main(String[] args) {
int i = 1;
int evenSum = 0;
while(i <= 100){
if(i % 2 == 0){
evenSum += i;
}
i++;
}
System.out.println("1~100偶数总和:" + evenSum);
}
}
3.3.2 do-while 循环(先执行、后判断)
至少执行一次,适合人机交互、输入校验场景。
全新示例:模拟签到打卡(至少提示一次)
public class DoWhileSignTest {
public static void main(String[] args) {
int count = 1;
do {
System.out.println("今日第" + count + "次打卡成功");
count++;
} while (count <= 3);
}
}
3.3.3 for 循环(开发首选)
结构紧凑、变量作用域可控,适合已知循环次数场景。
全新示例:输出1~100所有能被4整除的数
public class ForFourTest {
public static void main(String[] args) {
System.out.println("1~100能被4整除的数:");
for(int i = 1; i <= 100; i++){
if(i % 4 == 0){
System.out.print(i + " ");
}
}
}
}
3.3.4 嵌套循环
外层控行、内层控列,用于打印图形、批量双层遍历。
全新示例:打印6行6列星号矩阵
public class NestMatrixTest {
public static void main(String[] args) {
for(int i = 0; i < 6; i++){
for(int j = 0; j < 6; j++){
System.out.print("* ");
}
System.out.println();
}
}
}
全新九九乘法表(排版优化版)
public class MultiTableTest {
public static void main(String[] args) {
for(int row = 1; row <= 9; row++){
for(int col = 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整除的数
public class BreakSevenTest {
public static void main(String[] args) {
for(int i = 10; i < 50; i++){
if(i % 7 == 0){
System.out.println("找到目标数:" + i);
break;
}
}
}
}
全新continue示例:跳过偶数,只输出奇数
public class ContinueOddTest {
public static void main(String[] args) {
for(int i = 1; i <= 30; i++){
if(i % 2 == 0){
continue;
}
System.out.print(i + " ");
}
}
}
3.4 方法(代码复用核心)
方法是具备独立功能的代码块,可以重复调用,解决代码冗余、杂乱问题,是面向对象的基础。
3.4.1 方法语法格式
修饰符 返回值类型 方法名(形参列表){
方法体
return 返回值;
}
3.4.2 基础方法示例(全新案例)
定义方法实现「计算两数乘积」和「打印欢迎语」
public class MethodBaseTest {
public static void main(String[] args) {
// 调用方法
printWelcome();
int res = getMultiply(9, 7);
System.out.println("两数乘积结果:" + res);
}
// 无参无返回值
public static void printWelcome(){
System.out.println("欢迎使用方法工具类!");
}
// 有参有返回值
public static int getMultiply(int a, int b){
return a * b;
}
}
3.4.3 方法重载
同一个类中,方法名相同、参数列表不同(个数/类型/顺序),与返回值、参数名无关。
全新重载示例:多类型求和工具
public class OverloadTest {
public static void main(String[] args) {
System.out.println("两整数和:" + sum(12,23));
System.out.println("三整数和:" + sum(11,22,33));
System.out.println("浮点和:" + sum(2.5,3.6));
}
public static int sum(int a,int b){
return a + b;
}
public static int sum(int a,int b,int c){
return a + b + c;
}
public static double sum(double a,double b){
return a + b;
}
}
重载误区总结:仅返回值不同、仅参数名不同,都不构成重载。
3.4.4 实战方法案例:考勤罚款系统(全新逻辑)
public class AttendFineTest {
public static void main(String[] args) {
double fine = calcFine(25, 8000);
System.out.println("本次迟到罚款:" + fine + "元");
}
public static double calcFine(int lateMin, double monthSalary){
double fineMoney = 0;
double daySalary = monthSalary / 21.75;
if(lateMin <= 5){
System.out.println("轻微迟到,口头警告");
}else if(lateMin <= 15){
fineMoney = 50;
}else if(lateMin <= 30){
fineMoney = 150;
}else if(lateMin < 60){
fineMoney = daySalary / 2;
}else{
fineMoney = daySalary * 2;
}
return fineMoney;
}
}
3.5 递归算法
递归核心:方法自己调用自己,适合拆解重复性子问题,常用于数学运算、遍历、搜索算法。
递归必备两点:递归头(终止条件)、递归体(递推逻辑)
全新示例:递归计算累加 1~n
public class RecursionSumTest {
public static void main(String[] args) {
int result = getTotal(50);
System.out.println("1~50累加结果:" + result);
}
public static int getTotal(int n){
// 递归头
if(n == 1){
return 1;
}
// 递归体
return n + getTotal(n - 1);
}
}
递归优缺点:代码简洁优雅,但会占用栈内存,层数过多容易栈溢出,复杂场景优先循环。
本章核心知识点总结
-
程序三大结构:顺序、选择、循环,覆盖所有编程逻辑;
-
if 适合区间判断,switch 适合固定值匹配,注意 case 穿透问题;
-
while先判后执行、do-while至少执行一次、for循环为开发首选;
-
break结束整体循环,continue跳过本次循环;
-
方法实现代码复用,重载提升方法兼容性;
-
递归核心是自己调用自己,必须设置终止条件,慎用深层递归。
更多推荐
所有评论(0)