社交媒体

方法与重载

方法与重载

钩子

你天天写 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 把结果交回调用处。参数是"进去的",返回值是"回来的",方向别搞反。

11-方法调用执行流程图.png

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


橙码酱,分享更有用的技术知识,助你成为更优秀的开发者。