Java重载方法的区分核心依据是方法签名,即方法名加参数类型有序列表;返回类型、异常声明、修饰符不参与签名,无法用于重载区分。
Java中重载方法的区分,**核心依据是方法签名(Method Signature)**,即方法名 + 参数类型列表(按声明顺序),与返回类型、异常声明、修饰符无关。
根据Java语言规范(JLS §8.4.2),方法签名由以下两部分组成:
void foo(int, String) 和 void foo(String, int) 是不同签名)以下内容不参与签名构成,因此不能用于区分重载:
– 返回类型(int get() 和 String get() 不能共存)
– 异常声明(void run() throws IOException 和 void run() throws Exception)
– 访问修饰符(public/private)、static、final 等
Java编译器在调用处(如 obj.doX(1, "a"))执行静态解析(Static Resolution
),分三步完成匹配:
private、符合包/继承可见性)且方法名匹配的候选方法short,void m(int) 比 void m(long) 更具体;传入 String,void m(CharSequence) 和 void m(Object) 都可行,但 CharSequence 是更具体的父类型,优先选它(若二者无继承关系则报错)以下情况看似合理,实则会导致编译错误或行为不符合直觉:
void f(int) 和 void f(Integer) 同时存在时,调用 f(null) 编译失败(ambiguous);而 f(5) 会绑定到 int 版本(优先使用基本类型转换而非装箱)void g(String...) 和 void g(String) 共存时,g("a") 绑定到 String 版本(varargs 是最低优先级匹配);但 g((String)null) 仍明确调用单参版本 void h(T) 和 void h(U) 擦除后都是 h(Object),无法共存,编译报错当遇到 “cannot resolve method” 或 “ambiguous reference” 时,可:
obj.process((Object)list) 或 obj.process((List>)null)
null、泛型、基础类型与包装类混用时,优先使用明确类型的方法命名(如 processAsList() / processAsString())