java中方法重写通过运行时根据实际对象类型动态绑定实现多态,要求方法为非static、非private、非final的实例方法,且子类方法签名与父类一致、访问权限不更严格、异常范围不更宽泛;static、private、final方法采用编译期静态绑定。

Java 中方法重写实现动态绑定,核心在于运行时根据实际对象类型决定调用哪个方法,而不是看引用变量的声明类型。这正是多态得以成立的基础。
重写方法必须满足基本条件
只有满足以下要求,JVM 才会在运行期进行动态绑定(也叫晚期绑定):
- 方法必须是实例方法(非 static、非 private、非 final)
- 子类中方法名、参数列表、返回类型(协变返回类型允许)与父类完全一致
- 访问权限不能比父类更严格(比如父类是 protected,子类不能是 private)
- 抛出的异常类型不能比父类更宽泛
动态绑定发生在运行期,由 JVM 自动完成
编译器只检查语法和继承关系,真正决定调用哪个版本的方法,是在程序运行时由 JVM 根据对象的实际类型(new 后面的类)查虚方法表(vtable)确定的。
例如:
Animal a = new Dog();a.sound(); // 调用 Dog 的 sound(),不是 Animal 的
即使 a 声明为 Animal 类型,只要它指向 Dog 实例,就会执行 Dog 里重写的 sound 方法。
static、private、final 方法不参与动态绑定
这些方法在编译期就绑定了目标(静态绑定),无法被多态机制覆盖:
- static 方法:属于类,通过类名调用,和对象无关
- private 方法:子类不可见,谈不上重写,只是“隐藏”
- final 方法:明确禁止重写,编译器会报错
向上转型是触发动态绑定的常见场景
把子类对象赋给父类引用,是体现多态最典型的方式:
Animal cat = new Cat();Animal bird = new Bird();
cat.move(); // Cat 的 move
bird.move(); // Bird 的 move
同一个 move() 调用,在不同对象上表现出不同行为——这就是动态绑定带来的多态效果。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











