方法重载是Java中实现编译时多态的核心方式,要求同一类中同名方法具有不同参数列表(个数、类型或顺序),而返回类型等差异不构成重载。

方法重载(Overload)是 Java 中实现编译时多态的核心方式。它不依赖对象的实际类型,而是在代码编译阶段,由编译器根据调用时传入的参数类型、个数或顺序,直接决定调用哪个同名方法。
重载发生的前提条件
要构成合法的方法重载,必须满足“三同一不同”:
- 同一个类:重载方法必须定义在同一个类中(父子类之间虽可出现同名方法,但属于重写或独立定义,不是严格意义上的重载)
- 同一个方法名:所有重载方法名称完全一致
-
不同参数列表:差异只能体现在参数上,包括:
- 参数个数不同(如
add(int)和add(int, int)) - 参数类型不同(如
print(String)和print(int)) - 参数顺序不同(仅当类型不同时有效,如
func(String, int)和func(int, String))
- 参数个数不同(如
注意:返回类型、访问修饰符、异常声明不同,不能作为重载依据。下面这段代码会编译失败:
public int getValue() { return 1; }public String getValue() { return "a"; }
编译器如何做选择
编译时,Javac 不看变量实际指向什么对象,只看方法调用时的实参——包括字面量类型、变量声明类型、是否发生隐式类型转换等。例如:
立即学习“Java免费学习笔记(深入)”;
-
calc.add(5, 3)→ 匹配add(int, int) -
calc.add(5.0, 3.0)→ 匹配add(double, double) -
int x = 1; calc.add(x, x, x)→ 匹配add(int, int, int)
如果存在多个可匹配的重载(比如传入 null,且多个重载都接受引用类型),编译器会选择最具体的那个;若无法判定,则报错。
重载与多态的关系
方法重载体现的是编译时多态,也叫静态多态。它的“多态性”体现在:同一个方法名,在不同参数组合下,表现出不同行为,但这个行为选择在编译期就固定了,运行时不会改变。
这和运行时多态(如父类引用调用子类重写方法)有本质区别:后者依赖对象真实类型,前者只依赖调用现场的参数签名。
常见误区提醒
- 重载发生在编译期,和继承体系无关;重写才需要父子类关系
- 构造方法可以重载,但不能被重写
- 泛型方法的类型擦除可能影响重载判断,需谨慎设计(如
foo(List<String>)和foo(List<Integer>)擦除后签名相同,无法共存)


















