方法重载仅由方法名和参数列表(类型、个数、顺序)决定,返回值、参数名、修饰符、异常声明等不影响签名;编译期根据实参的编译时类型静态解析调用版本。

方法重载的区分只看参数签名,也就是方法名加上参数列表(类型、个数、顺序),其他一概不管。
参数列表必须不同
只要满足以下任一条件,就构成重载:
- 参数个数不同:比如 print() 和 print(String)
- 参数类型不同:比如 show(int) 和 show(String)
- 参数顺序不同(且类型不一致):比如 swap(int, String) 和 swap(String, int)
这些变化不算重载
仅改动以下内容,编译器会报错“Duplicate method”,因为签名没变:
- 只改返回值类型:void show() 和 int show() → 不合法
- 只改参数变量名:show(int a) 和 show(int b) → 不合法
- 只改访问修饰符:public show() 和 private show() → 不合法
- 只改异常声明:void show() throws IOException 和 void show() → 不合法
签名是类内唯一标识
在一个类中,方法名 + 参数类型序列共同构成唯一签名。例如:
立即学习“Java免费学习笔记(深入)”;
- init(String, int, double) 和 init(String, int, float) 是两个不同签名,可共存
- display(Object) 和 display(String) 是重载(因为 String 是 Object 子类,但类型不同)
- 泛型擦除后签名相同也不行:比如 getData(List<String>) 和 getData(List<Integer>) 擦除后都是 getData(List),不能重载
编译期静态解析
调用时具体执行哪个重载版本,由编译器根据实参的**编译时类型**决定:
- Object obj = "hello"; display(obj); → 调用 display(Object)
- display("hello"); → 调用 display(String),即使 String 继承自 Object


















