方法重载仅由方法名、参数个数和参数类型(顺序)决定,与返回类型、修饰符、异常声明无关;重载解析在编译期按“最精确匹配”原则进行,构造器重载规则相同,需区分重载与重写。
方法重载只看参数列表,和返回类型无关
Java 判断是否构成重载,**完全依据方法名 + 参数个数 + 参数类型(顺序)**,返回类型、修饰符(public/static等)、异常声明统统不影响重载判定。哪怕两个方法仅返回类型不同,编译器会直接报错:method xxx() is already defined。
常见错误现象:写完两个只有 int 和 long 返回值不同的同名方法,以为是重载,结果编译失败。
- 参数类型必须是可区分的原始类型或引用类型,比如
void foo(int)和void foo(Integer)可以共存(自动装箱不改变重载判断时机) - 可变参数
foo(String...)本质是数组,所以和foo(String[])不能同时存在,否则编译报错 - 泛型擦除后若签名一致(如
bar(List)和bar(List)),也不算重载
重载解析发生在编译期,按“最精确匹配”原则选方法
调用时没有运行时多态,JVM 在编译阶段就锁定具体调用哪个重载版本。它从所有候选方法中挑一个“最具体”的:参数类型越接近实参类型,优先级越高。
例如有 print(Object)、print(String)、print(CharSequence),传入 "abc" 会选 print(String);但传入 null 时,如果只有 print(String) 和 print(Integer),编译器会报错 —— 因为 null 对两者都“同样模糊”。
立即学习“Java免费学习笔记(深入)”;