方法重载即编译时多态,编译器依据实参类型、个数、顺序在编译期静态绑定调用方法,与运行时对象实际类型无关;参数列表必须可区分,返回值等不能参与重载解析。

方法重载本身就是编译时多态的实现方式,不需要“满足要求”去达成它——只要符合重载规则,就天然构成编译时多态。
重载即编译时多态
Java 中的编译时多态,指编译器在编译阶段就确定调用哪个具体方法,不依赖对象运行时的实际类型。重载正是通过参数列表差异,让编译器能静态地、唯一地选出匹配的方法。
- 编译器只看调用处的实参类型、个数和顺序,结合方法声明的形参签名做匹配
- 整个过程不查对象真实类,也不走虚方法表,完全在 javac 阶段完成
- 哪怕写
Object obj = new String(); obj.toString();,这里toString()是重写,不是重载;而print(1)和print("a")才是重载+编译时多态的典型
必须保证参数列表可区分
编译器需要能无歧义地选中一个重载版本,所以参数列表必须真正不同:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 参数个数不同:如
add(int)和add(int, int) - 参数类型不同:如
show(int)和show(String) - 参数顺序不同(仅当类型不同时有效):如
process(int, String)和process(String, int) - 不能仅靠返回值、异常、访问修饰符或参数名来区分——这些对重载解析无效
调用依据是声明类型,不是实际类型
重载解析与变量的声明类型强绑定,和它指向什么对象无关:
立即学习“Java免费学习笔记(深入)”;
-
Object o = "hello"; print(o);→ 调用print(Object),哪怕 o 实际是 String -
String s = "hi"; print(s);→ 调用print(String),如果存在该重载 - null 值没有类型,编译器会选最宽泛的匹配(如同时有
print(String)和print(Object),null 会进后者)
重载可以出现在同一类或父子类中
重载不要求继承关系,但允许跨类可见:
- 子类中定义一个与父类同名但参数不同的方法,属于重载(不是重写)
- 构造方法天然支持重载,且常见于初始化逻辑差异化
- 泛型擦除后签名冲突会导致编译失败,例如
foo(List<String>)和foo(List<Integer>)擦除后都是foo(List),无法共存

















