钩子
你天天写 System.out.println(...),有没有想过一个问题:为什么 int 能打印,double 能打印,字符串能打印,连数组都能打印?
难道 JDK 的工程师给每种类型都写了一个 println?还真差不多——但它们全都叫同一个名字。Java 是怎么分清的?答案就是今天的主题:方法,以及方法重载。
01 没有方法的世界:复制粘贴地狱
先看痛点。任务:算三个班级各自的平均分。
不用方法,你得把"求和再除以人数"这段逻辑写三遍。哪天算法变了(比如要去掉一个最高分),三处都得改,漏一处就是一个 bug。
方法就是解药:这段逻辑只写一遍,起个名字,谁需要谁来调。
02 方法的五要素,写之前过一遍
public static double avg(int sum, int count) {
return (double) sum / count;
}
| 要素 | 这里的值 | 一句话解释 |
|---|---|---|
| 修饰符 | public static | 谁能调用(static 暂时死记,第 13 篇解密) |
| 返回值类型 | double | 方法干完活交回来的数据类型 |
| 方法名 | avg | 调用时的暗号 |
| 参数列表 | int sum, int count | 干活需要的原料 |
| 方法体 | return ... | 具体干活的代码 |
调用:double a = avg(470, 5);。执行流程:5 和 470 装进参数 → 执行方法体 → return 把结果交回调用处。参数是"进去的",返回值是"回来的",方向别搞反。

void 也要认识:不交东西回来的方法,返回值类型写 void,没有 return 或者只写 return;。
03 重载:println 的秘密
现在揭晓 println 能打一切的原因——它有一堆"兄弟姐妹":
System.out.println(100); // println(int)
System.out.println(99.5); // println(double)
System.out.println("橙码酱"); // println(String)
System.out.println('A'); // println(char)
名字全叫 println,但参数类型不同——这就是重载(Overload):同一个类里,方法名相同,参数列表不同(个数不同,或类型不同,或顺序不同)。
判定重载只看参数列表,跟返回值无关。 这句话是考点也是坑:
public static int f(int x) { ... }
public static double f(int x) { ... } // 编译报错!
参数一样、只有返回值不同,JVM 调用 f(10) 时根本不知道该接哪个返回值——直接编译报错,不存在"返回值不同也算重载"这回事。
04 一个隐藏规则:f(10) 到底调了谁
public static void show(int x) { System.out.println("int 版本"); }
public static void show(double x) { System.out.println("double 版本"); }
调用 show(10),输出 int 版本。规则:先找参数类型完全一致的,找不到才考虑自动类型转换(10 可以提升成 10.0,所以才会考虑 double 版本)。
再进一步:如果只有 show(double) 和 show(long) 呢?show(10) 会调 long 版本——因为 int 转 long 是"小到大"顺路,int 转 double 虽然也顺路,但 long 更"近"。细节现在不用背,记住"精确匹配优先"就够了,剩下的编译器会告诉你答案。
本文示例代码均已本地实测通过,可直接运行。
对应文件:MethodDemo.java
橙码酱,分享更有用的技术知识,助你成为更优秀的开发者。