方法重载是编译期静态绑定,不构成多态;方法重写是运行时动态绑定,是java多态的唯一基础。重载依据参数选择方法,重写依据对象实际类型查vtable调用。

Java 中方法重载和方法重写在多态中的角色完全不同:重载不构成真正意义上的多态,它只是编译期的静态选择;而重写才是运行时多态的核心机制。
重载是编译期行为,与多态无关
重载发生在同一个类中,编译器根据调用时传入的参数类型、个数和顺序,在编译阶段就锁定了具体方法。这个过程不依赖对象的实际类型,也不涉及继承关系。
- 即使使用父类引用指向子类对象,只要调用的是本类中重载的方法,选哪个版本只看参数,跟对象运行时类型无关
- 返回类型、访问修饰符、异常声明这些都不参与重载判断
- 泛型擦除后签名相同(如
process(List<string>)</string>和process(List<integer>)</integer>)会编译失败,不是重载
重写是运行时多态的唯一基础
重写必须出现在父子类之间,JVM 在运行时通过对象的实际类型查虚方法表(vtable),动态决定执行哪个版本的方法。这是 Java 多态能力的来源。
- 只有重写支持“一个接口,多种实现”——比如
Animal a = new Dog(); a.speak();调用的是Dog.speak() -
static、private、final方法不能被重写,它们绑定在编译期,不参与多态 - 必须加
@Override注解,否则容易因拼写错误或继承断裂导致“假重写”
关键区分点:看绑定时机和调用依据
判断一段代码体现的是重载还是重写,核心就两条:
- 如果方法选择取决于“你传了什么参数”,那就是重载(编译期决定)
- 如果方法选择取决于“你创建的是什么对象”,那就是重写(运行期决定)
- 二者可以共存:子类既能重写父类方法,也能在自己类里重载同名方法,但它们互不影响
常见混淆场景提醒
以下情况看似像多态,实际不是重写带来的效果:
- 父类引用调用子类重载的方法 → 编译报错,因为子类没有继承重载方法,该方法根本不可见
- 子类定义了与父类
private方法同名的方法 → 这是新方法,不是重写,也不参与多态 - 子类重写了方法,但调用时用了
static修饰 → 绑定到引用类型,失去多态性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











