跟着我带你从最基础的入门打通 Java 基础的方法核心知识点目录一、什么是方法1. 方法的概念2. 为什么要用方法3. 和 C 语言函数对比二、方法的定义与调用1. 基本语法格式2. 无参无返回值方法3. 有参无返回值方法4. 有参有返回值方法5. 方法调用执行流程三、方法重载1. 什么是重载2. 重载规则3. 重载示例代码四、方法参数传递1. 值传递的概念2. 基本类型传递示例3. 引用类型传递示例五、递归方法1. 什么是递归2. 递归三要素3. 阶乘递归示例4. 递归的优缺点六、总结一、什么是方法1. 方法的概念方法说白了就是一段可以重复使用的代码块它能完成某个特定的功能。你可以把它理解成一个 功能盒子给它一些输入它就给你一些输出或者干脆不给输出只干一件事。举个栗子你想做蛋炒饭每次都要写一遍 洗锅→倒油→打鸡蛋→放米饭→放盐→翻炒 这一大串步骤吗当然不用你可以把这些步骤打包成一个 做蛋炒饭 的方法以后想吃了直接调用这个方法就行2. 为什么要用方法那有人就问了我直接把代码写在 main 里不行吗为啥还要搞个方法出来多此一举问得好用方法有三大好处好处说明代码复用写一遍用 N 遍不用每次都复制粘贴模块化把大问题拆成小问题每个方法解决一个小问题思路更清晰可读性别人一看方法名就知道这一段是干啥的不用读几百行代码想象一下如果一个 main 方法里写了 1000 行代码你找 bug 不得找疯了但如果拆成 10 个方法每个方法 100 行是不是就好找多了3. 和 C 语言函数对比表情包开个玩笑哈哈哈学过 C 语言的同学肯定发现了Java 的 方法 不就是 C 语言的 函数 嘛没错本质上是一个东西只是叫法不同而已。我们来对比一下// C语言函数定义int add(int a, int b) {return a b;}// C语言函数调用int result add(3, 5);、// Java方法定义public static int add(int a, int b) {return a b;}// Java方法调用int result add(3, 5);看到没几乎一模一样只是 Java 多了public static这两个修饰符而已。这俩修饰符现在你不用深究记住写方法的时候加上就行后面我们讲面向对象的时候再细说。那有人就问了C 语言里函数可以写在 main 外面Java 也是这样吗没错Java 的方法也必须写在类里面但是和 main 方法是平级的不能写在 main 里面哦二、方法的定义与调用1. 基本语法格式Java 方法的基本语法长这样修饰符 返回值类型 方法名(参数类型 参数名1, 参数类型 参数名2, ...) {// 方法体return 返回值;}我们来拆解一下修饰符现在就写public static就行固定搭配返回值类型方法执行完返回什么类型的数据不返回就写void方法名和变量名一样小驼峰命名见名知意参数列表方法需要什么输入没有就空着return返回结果返回值类型是 void 的话可以不写2. 无参无返回值方法最简单的方法既不需要输入也不需要输出就是干一件事。// 定义一个打招呼的方法 public static void sayHello() { System.out.println(Hello, Java!); System.out.println(我是一个无参无返回的方法); } public static void main(String[] args) { // 调用方法 sayHello(); sayHello(); // 想调用几次就调用几次 }运行结果Hello, Java!我是一个无参无返回的方法Hello, Java!我是一个无参无返回的方法那有人就问了我调用方法的时候方法名后面的括号能不能省略当然不行括号是方法的标志哪怕没有参数括号也必须写上这是语法规定3. 有参无返回值方法需要输入但不需要输出的方法。// 定义一个打印n次Hello的方法 public static void printHello(int n) { for (int i 0; i n; i) { System.out.println(Hello!); } } public static void main(String[] args) { printHello(3); // 打印3次 System.out.println(分隔线); printHello(5); // 打印5次 }运行结果Hello!Hello!Hello!分隔线Hello!Hello!Hello!Hello!Hello!那有人就问了我传参数的时候类型必须和定义的一样吗必须的定义的是 int你就得传 int传个 String 进去肯定报错。这就像你去自动售货机买水人家要硬币你塞张纸币进去人家能认吗一个道理。4. 有参有返回值方法既需要输入也需要输出的方法。这是我们最常用的方法类型。// 定义一个加法方法 public static int add(int a, int b) { int sum a b; return sum; // 把计算结果返回 } // 定义一个求最大值的方法 public static int getMax(int a, int b) { return a b ? a : b; // 直接返回不用中间变量也行 } public static void main(String[] args) { int result1 add(3, 5); System.out.println(3 5 result1); int result2 getMax(10, 20); System.out.println(最大值是 result2); // 方法调用也可以直接当值用 System.out.println(100 200 add(100, 200)); }运行结果3 5 8最大值是20100 200 300那有人就问了return 后面的代码还会执行吗不会return 一执行方法就立刻结束了后面的代码根本不会跑。就像你在函数里写了 return 0; 后面的代码就都不执行了和 C 语言一模一样5. 方法调用执行流程很多新手搞不懂方法调用的时候代码到底是怎么跑的。我给大家画个流程图main方法开始执行↓执行到方法调用语句↓【跳转到方法内部执行】↓执行完方法体 / 遇到return↓【跳回main方法继续往下执行】就像跳房子一样跳过去执行完再跳回来。三、方法重载1. 什么是重载可能有人以为和重复有关系但其实只能说有一点关系。方法重载就是同一个类中方法名相同但参数列表不同的多个方法。说人话就是同一个方法名可以干不同的事。就像 打印 这个动作可以打印文字可以打印图片可以打印 PDF虽然都叫 打印但干的事不一样。那有人就问了为啥要搞重载方法名不一样不行吗问得好你想想我们要做加法两个 int 相加叫 addInt两个 double 相加叫 addDouble三个 int 相加叫 addThreeInt这也太麻烦了都叫 add 不好吗编译器自己根据参数判断该调用哪个。这就是重载的意义2. 重载规则重载必须满足以下条件方法名必须相同废话不然叫啥重载参数列表必须不同满足以下任意一条就行参数个数不同参数类型不同参数顺序不同和返回值类型无关划重点这是坑为啥和返回值无关因为调用方法的时候你可以不接收返回值啊比如add(3,5);编译器怎么知道你要调用哪个返回值的方法所以返回值不能作为重载的判断依据。3. 重载示例代码// 两个int相加 public static int add(int a, int b) { System.out.println(调用了两个int的add); return a b; } // 三个int相加个数不同 public static int add(int a, int b, int c) { System.out.println(调用了三个int的add); return a b c; } // 两个double相加类型不同 public static double add(double a, double b) { System.out.println(调用了两个double的add); return a b; } // int和double相加顺序不同 public static double add(int a, double b) { System.out.println(调用了intdouble的add); return a b; } public static void main(String[] args) { System.out.println(add(3, 5)); // 调用两个int System.out.println(add(1, 2, 3)); // 调用三个int System.out.println(add(3.14, 2.56)); // 调用两个double System.out.println(add(10, 3.14)); // 调用intdouble }运行结果调用了两个int的add8调用了三个int的add6调用了两个double的add5.7调用了intdouble的add13.14编译器自动根据你传的参数选择正确的方法调用四、方法参数传递1. 值传递的概念Java 的参数传递只有一种方式值传递。什么是值传递就是把实参的副本传进去方法里修改的是这个副本原来的实参不会变。啥是实参啥是形参形参方法定义时括号里的参数比如add(int a, int b)里的 a 和 b实参调用方法时实际传进去的值比如add(3, 5)里的 3 和 5简单说形参是方法的 局部变量实参是你传进去的 值。2. 基本类型传递示例先看基本类型int、double、char 这些的传递public static void change(int n) { n 100; System.out.println(方法里的n n); } public static void main(String[] args) { int num 10; System.out.println(调用方法前的num num); change(num); System.out.println(调用方法后的num num); }运行结果调用方法前的num10方法里的n100调用方法后的num10方法里把 n 改成 100 了但外面的 num 还是 10因为传进去的是 num 的副本改副本不影响本尊。3. 引用类型传递示例再看引用类型数组、对象这些的传递public static void changeArray(int[] arr) { arr[0] 100; System.out.println(方法里的arr[0] arr[0]); } public static void main(String[] args) { int[] array {1, 2, 3}; System.out.println(调用方法前的array[0] array[0]); changeArray(array); System.out.println(调用方法后的array[0] array[0]); }运行结果调用方法前的array[0]1方法里的arr[0]100调用方法后的array[0]100调用方法前的array[0]1 方法里的arr[0]100 调用方法后的array[0]100哎怎么这次外面的值变了那有人就问了这不是引用传递吗不是这还是值传递听我给你解释数组变量存的不是数组本身而是数组的地址。传参的时候把这个地址的副本传进去了。虽然是副本但副本和原件指向的是同一个数组啊所以通过副本改数组原件当然能看到变化。这就像你家的地址是 北京市 XX 路 XX 号你把这个地址抄给朋友朋友根据这个地址去你家把你家电视砸了。你回家一看电视是不是真的碎了虽然你给的是地址的副本但指向的是同一个房子啊记住Java 只有值传递没有引用传递引用类型传的是 地址值 的副本本质还是值传递。五、递归方法1. 什么是递归递归就是方法自己调用自己。说人话就是我调用我自己。那有人就问了自己调用自己不会死循环吗问得好所以递归必须有终止条件不然就真的死循环了最后栈溢出报错。递归就像我们小时候听的故事从前有座山山里有座庙庙里有个老和尚讲故事讲的是从前有座山... 这个故事没有终止条件所以能讲一天一夜...2. 递归三要素写递归必须满足三个条件终止条件递归什么时候停下来必须有递归公式大问题怎么拆成小问题收敛方向每次递归都要更接近终止条件3. 阶乘递归示例最经典的递归例子求 n 的阶乘。阶乘公式n! n × (n-1)! 终止条件1! 1public static int factorial(int n) { // 终止条件 if (n 1) { return 1; } // 递归公式n! n * (n-1)! return n * factorial(n - 1); } public static void main(String[] args) { System.out.println(5! factorial(5)); System.out.println(3! factorial(3)); }运行结果5! 1203! 6我们来拆解一下 factorial (5) 的执行过程factorial(5) 5 * factorial(4)factorial(4) 4 * factorial(3)factorial(3) 3 * factorial(2)factorial(2) 2 * factorial(1)factorial(1) 1 遇到终止条件开始返回factorial(2) 2 * 1 2factorial(3) 3 * 2 6factorial(4) 4 * 6 24factorial(5) 5 * 24 120看到没先一层层往下拆拆到最底层再一层层往上算这就是递归的执行过程。4. 递归的优缺点优点缺点代码简洁思路清晰效率低有大量重复计算适合解决有递归性质的问题容易栈溢出递归深度太大很多算法天然就是递归的不好调试出问题很难找那有人就问了递归这么多缺点为啥还要用因为有些问题用递归写太简单了比如汉诺塔问题用递归写几行就搞定了用循环写能写死你...但是记住斐波那契千万不要用递归算 n40 以上的数慢到你怀疑人生因为有大量重复计算汉诺塔可以去看看我的算法思考有一期讲了。六、总结本章重点回顾方法就是可复用的代码块本质和 C 语言的函数一样方法分三种无参无返回、有参无返回、有参有返回方法重载同名不同参C 语言不支持这个特性Java 只有值传递基本类型传值副本引用类型传地址副本递归三要素终止条件、递归公式、收敛方向经典坑点基本类型的交换方法不生效因为改的是副本诸位共勉无限学习