java方法重载仅由方法名、参数类型、个数和顺序决定;返回值、修饰符、异常、形参名均无效;调用匹配基于实参的编译时类型。

Java 中方法重载通过参数列表区分,核心就一条:编译器只看方法名 + 参数类型、个数、顺序这三项,其他一概不认。只要这三者中至少有一项不同,就构成合法重载。
参数个数不同是最直观的区分方式
方法接收的形参数量不一样,编译器一眼就能分辨。
- 例如:
print()、print(String s)、print(String s, int n)是三个独立重载版本。 - 调用
print("hello")时,自动匹配到只有一个String参数的版本,不会犹豫。
参数类型不同是高频使用场景
相同数量的参数,但至少有一个位置上的类型不一致。
- 比如:
process(int x)和process(double x)可共存; -
find(Object obj)和find(String str)也能重载; - 注意:
int和Integer在重载中算不同类型(涉及装箱),但要小心自动转换带来的歧义。
参数顺序不同仅在类型不同时才有效
只有当对应位置的类型组合存在差异时,顺序变化才算“不同”。
-
show(int a, String b)和show(String b, int a)是两个合法重载; - 但
show(int a, int b)和show(int b, int a)不是重载——编译器认为参数列表完全一样,直接报错“duplicate method”。
这些内容不参与区分,写了也白写
- 返回值类型不同(哪怕一个是
int,一个是String)→ 不构成重载; - 访问修饰符不同(
publicvsprivate)→ 不影响重载判断; - 异常声明不同(
throws IOExceptionvsthrows SQLException)→ 编译器无视; - 形参变量名不同(
add(int a, int b)vsadd(int x, int y))→ 完全等价,不算重载。
关键提醒:
调用时匹配哪个重载版本,取决于实参的编译时类型,不是运行时类型。比如 Object obj = "test"; process(obj); 会走 process(Object),哪怕 obj 实际指向的是 String 实例。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











