【JavaSE全面教学】Java方法与方法重载Day5(2026年)
写在前面这是JavaSE系列的第5篇。前面我们学了Java的基础语法今天来学习方法——这是代码复用的基础也是面向对象编程的基石。方法学不好后面的类和对象根本没法理解。一、什么是方法方法Method就是一段可以重复使用的代码块。你可以把它理解为一个功能模块比如计算两个数的和一个子程序完成特定任务一个黑盒子输入参数得到结果为什么需要方法代码复用写一次多次使用模块化把复杂问题分解成小问题可读性用方法名表达意图代码更易读便于维护修改一处全局生效二、方法的定义和调用2.1 方法的基本结构修饰符 返回类型 方法名(参数列表){// 方法体return返回值;// 如果返回类型不是void}示例// 定义一个方法计算两个整数的和publicstaticintadd(inta,intb){intsumab;returnsum;}// 调用方法intresultadd(3,5);// result 8System.out.println(result);各部分说明部分说明示例修饰符访问权限等public static返回类型方法返回的数据类型int、String、void方法名标识方法小驼峰命名add、calculateSum参数列表输入数据可以有多个(int a, int b)方法体具体执行的代码{ ... }2.2 void方法无返回值// 无参数、无返回值publicstaticvoidsayHello(){System.out.println(Hello, World!);}// 有参数、无返回值publicstaticvoidprintInfo(Stringname,intage){System.out.println(姓名name);System.out.println(年龄age);}// 调用sayHello();printInfo(张三,25);2.3 return语句// 1. 返回结果publicstaticintmax(inta,intb){if(ab){returna;// 返回a方法结束}else{returnb;// 返回b方法结束}}// 2. 提前结束方法用于void方法publicstaticvoidcheckAge(intage){if(age0){System.out.println(年龄不能为负数);return;// 提前结束方法}System.out.println(年龄有效age);}// 3. return后面不能写代码编译错误publicstaticinttest(){return1;// System.out.println(这行会报错); // 不可达代码}三、参数传递值传递 vs 引用传递Java中只有值传递没有引用传递3.1 基本类型参数值传递publicstaticvoidmodify(intnum){num100;// 修改的是副本不影响原值System.out.println(方法内num);// 100}publicstaticvoidmain(String[]args){inta10;modify(a);System.out.println(方法外a);// 10没变}3.2 引用类型参数传递的是引用的值publicstaticvoidmodifyArray(int[]arr){arr[0]100;// 修改数组内容System.out.println(方法内arr[0]);// 100}publicstaticvoidmain(String[]args){int[]nums{1,2,3};modifyArray(nums);System.out.println(方法外nums[0]);// 100变了}但是不能让引用指向新对象publicstaticvoidchangeReference(int[]arr){arrnewint[]{100,200,300};// 让arr指向新数组System.out.println(方法内arr[0]);// 100}publicstaticvoidmain(String[]args){int[]nums{1,2,3};changeReference(nums);System.out.println(方法外nums[0]);// 1没变}面试高频题publicstaticvoidswap(inta,intb){inttempa;ab;btemp;}publicstaticvoidmain(String[]args){intx10,y20;swap(x,y);System.out.println(xx, yy);// x10, y20交换失败}结论Java中无法通过方法参数实现基本类型的交换可以用数组或返回值。四、方法重载Overloading方法重载同一个类中方法名相同参数列表不同。4.1 重载的规则publicclassCalculator{// 两个int相加publicintadd(inta,intb){returnab;}// 三个int相加参数个数不同publicintadd(inta,intb,intc){returnabc;}// 两个double相加参数类型不同publicdoubleadd(doublea,doubleb){returnab;}// 参数顺序不同也算重载publicvoidprint(Stringname,intage){}publicvoidprint(intage,Stringname){}}重载的条件✅ 参数个数不同✅ 参数类型不同✅ 参数顺序不同❌ 只有返回类型不同不算重载❌ 只有参数名不同不算重载4.2 重载的调用CalculatorcalcnewCalculator();calc.add(1,2);// 调用第一个返回3calc.add(1,2,3);// 调用第二个返回6calc.add(1.5,2.5);// 调用第三个返回4.0编译器如何确定调用哪个方法先找完全匹配的再找可以自动类型转换的如果找到多个选最精确的如果还是多个编译报错歧义五、可变参数Varargs// 计算任意个数整数的和publicstaticintsum(int...numbers){inttotal0;for(intnum:numbers){totalnum;}returntotal;}// 调用sum();// 0sum(1);// 1sum(1,2,3);// 6sum(1,2,3,4,5);// 15// 可变参数本质上是数组publicstaticvoidprintAll(Stringprefix,int...nums){System.out.print(prefix: );for(intnum:nums){System.out.print(num );}}可变参数的规则一个方法只能有一个可变参数可变参数必须是最后一个参数可变参数可以传0个或多个值六、递归方法递归方法调用自身。6.1 递归的要素递归出口终止条件什么时候停止递归递归体如何将问题分解为更小的子问题6.2 经典递归示例// 1. 阶乘publicstaticintfactorial(intn){if(n1)return1;// 出口returnn*factorial(n-1);// 递归}// 5! 5 * 4 * 3 * 2 * 1 120// 2. 斐波那契数列publicstaticintfibonacci(intn){if(n1)returnn;// 出口returnfibonacci(n-1)fibonacci(n-2);// 递归}// 0, 1, 1, 2, 3, 5, 8, 13...// 3. 数组求和publicstaticintsumArray(int[]arr,intindex){if(indexarr.length)return0;// 出口returnarr[index]sumArray(arr,index1);// 递归}// 4. 二分查找递归版publicstaticintbinarySearch(int[]arr,inttarget,intleft,intright){if(leftright)return-1;// 出口没找到intmidleft(right-left)/2;if(arr[mid]target)returnmid;if(arr[mid]target){returnbinarySearch(arr,target,mid1,right);}else{returnbinarySearch(arr,target,left,mid-1);}}6.3 递归的注意事项// ❌ 错误没有出口无限递归publicstaticvoidinfinite(){infinite();// StackOverflowError}// ❌ 错误递归太深栈溢出publicstaticlongbadFibonacci(intn){if(n1)returnn;returnbadFibonacci(n-1)badFibonacci(n-2);}// fibonacci(50) 会计算很久因为重复计算太多// ✅ 优化使用记忆化publicstaticlonggoodFibonacci(intn,long[]memo){if(n1)returnn;if(memo[n]!0)returnmemo[n];memo[n]goodFibonacci(n-1,memo)goodFibonacci(n-2,memo);returnmemo[n];}七、方法的最佳实践7.1 命名规范// ✅ 动词开头小驼峰publicvoidcalculateTotal(){}publicintgetMaxValue(){}publicbooleanisValid(){}publicvoidsetName(Stringname){}// ❌ 避免publicvoidabc(){}// 无意义publicvoiddoSomething(){}// 太笼统publicvoidCalculateTotal(){}// 大写开头7.2 方法长度// ✅ 一个方法只做一件事长度控制在20-30行publicdoublecalculateCircleArea(doubleradius){returnMath.PI*radius*radius;}// ❌ 避免过长的方法publicvoiddoEverything(){// 100行代码...// 做了N件事...}7.3 参数数量// ✅ 参数不宜过多超过4个考虑用对象封装publicvoidcreateUser(Stringname,intage,Stringemail,Stringphone){}// 更好的做法publicvoidcreateUser(UserInfouser){}classUserInfo{Stringname;intage;Stringemail;Stringphone;}八、综合练习练习1计算器publicclassCalculator{publicintadd(inta,intb){returnab;}publicdoubleadd(doublea,doubleb){returnab;}publicintsubtract(inta,intb){returna-b;}publicintmultiply(inta,intb){returna*b;}publicdoubledivide(inta,intb){if(b0){thrownewArithmeticException(除数不能为0);}return(double)a/b;}}练习2数组工具类publicclassArrayUtils{// 求最大值publicstaticintmax(int[]arr){intmaxarr[0];for(intnum:arr){if(nummax)maxnum;}returnmax;}// 求平均值publicstaticdoubleaverage(int[]arr){intsum0;for(intnum:arr){sumnum;}return(double)sum/arr.length;}// 反转数组publicstaticvoidreverse(int[]arr){intleft0,rightarr.length-1;while(leftright){inttemparr[left];arr[left]arr[right];arr[right]temp;left;right--;}}}练习3汉诺塔问题publicclassHanoi{publicstaticvoidhanoi(intn,charfrom,charto,charaux){if(n1){System.out.println(将盘子 1 从 from 移到 to);return;}hanoi(n-1,from,aux,to);System.out.println(将盘子 n 从 from 移到 to);hanoi(n-1,aux,to,from);}publicstaticvoidmain(String[]args){hanoi(3,A,C,B);}}九、面试高频考点考点1Java是值传递还是引用传递答案Java只有值传递。基本类型传递值的副本引用类型传递引用的副本地址的副本考点2重载和重写的区别特性重载Overloading重写Overriding位置同一类中子类中方法名相同相同参数列表必须不同必须相同返回类型可以不同必须相同或是子类型访问修饰符可以不同不能更严格异常可以不同不能更宽泛考点3为什么不能用返回值区分重载// 编译器无法确定调用哪个publicintmethod(){return1;}publicdoublemethod(){return1.0;}intresultmethod();// 歧义十、总结今天我们学习了✅ 方法的定义和调用✅ 参数传递机制值传递✅ 方法重载✅ 可变参数✅ 递归方法✅ 方法的最佳实践重点记忆Java只有值传递重载的条件参数个数、类型、顺序不同递归必须有出口一个方法只做一件事下一步预告Day6我们将正式进入面向对象编程——类与对象这是Java的核心互动话题你在写递归的时候有没有遇到过栈溢出或者方法参数传递的困惑欢迎在评论区分享如果这篇文章对你有帮助欢迎点赞、收藏这是【JavaSE全面教学】系列的第5篇关注我看完整套教程本文为【JavaSE全面教学】系列第5篇持续更新中…