重载是编译期静态绑定,依据参数列表选择方法;多态是运行期动态绑定,依赖继承、重写和向上转型,根据实际对象类型调用对应方法。

方法重载(Overload)的解析发生在编译阶段,而多态的核心体现是运行时行为的动态分派——这是两者最根本的区别。
重载靠参数匹配,编译期就定死
重载不涉及继承或对象类型,只看调用时传入的实参类型、个数和顺序。编译器根据这些信息,在同一类中筛选出签名唯一匹配的方法。它不关心对象是谁创建的,也不依赖实际运行时类型。
- 比如 print(int) 和 print(String) 在同一个类里,调用 print(5) 就绑定到 int 版本,print("a") 就绑定到 String 版本,全程无运行时判断
- 返回类型、异常、访问修饰符不同,不影响重载判定;仅靠返回类型不同无法构成重载
- 静态方法、构造器、普通实例方法都可重载,只要在同一作用域内参数列表不同即可
多态依赖对象真实类型,运行时才决定执行谁
多态(特指运行时多态)要求有继承关系、方法重写(Override)、以及父类引用指向子类对象。JVM 在执行时,根据对象的实际类型(而非变量声明类型)查找并调用对应版本的方法。
- 例如 Animal a = new Dog(); a.makeSound();,虽然 a 是 Animal 类型,但运行时调用的是 Dog 的 makeSound()
- 这个过程依赖虚方法表(vtable)或类似机制,属于动态绑定
- 没有重写就没有运行时多态;仅有重载,哪怕参数适配再灵活,也与多态无关
重载不是多态的实现方式,而是独立的语法特性
常有人误称重载为“编译时多态”,但这容易混淆概念。严格来说,重载只是编译器对同名方法的静态解析策略,不改变对象行为的多样性本质。真正的多态强调“同一接口,不同实现”,且该实现由对象身份在运行时自主选择。
- 重载解决的是“一个名字怎么应对多种输入”的便利性问题
- 多态解决的是“统一调用如何适配不同实体”的扩展性问题
- 二者可共存(如父类有重载方法,子类又重写了其中某一个),但逻辑层级不同:重载在类内部,多态在类之间
关键差异一句话总结
重载是编译器看着参数选方法,多态是虚拟机看着对象找实现——前者不动态,后者不看参数。










