Java多态性通过方法调用的动态绑定体现,核心是“编译看类型,运行看对象”;只有被重写(override)的实例方法才参与动态绑定,JVM在运行时根据实际对象类型决定调用哪个版本,而非编译期锁定。

Java 中多态性通过**方法调用时的动态绑定**来体现,核心是“编译看类型,运行看对象”。不是所有成员都参与这个机制——只有被重写(override)的实例方法才会在运行时根据实际对象类型决定调用哪个版本。
动态绑定只作用于重写的方法
父类引用指向子类对象后,调用该方法时:
- JVM 不在编译期就锁定具体实现,而是推迟到运行时
字段访问不触发动态绑定
成员变量(包括实例变量和静态变量)没有多态性:
- 访问变量时,结果由引用的编译时类型决定
- 子类定义同名字段,只是隐藏(hiding)父类字段,不是重写
- 例如
Parent p = new Child(); System.out.println(p.name);输出的是Parent.name
哪些方法无法动态绑定
以下情况会跳过动态绑定,走静态绑定(编译期确定):
立即学习“Java免费学习笔记(深入)”;
- static 方法:属于类,不依赖对象实例,调用取决于引用类型
- private 方法:不可被继承或重写,子类中同名方法是全新方法
- final 方法:禁止重写,JVM 可直接内联优化
- 构造方法:不参与多态,每个类独立调用自己的构造器
向上转型是触发动态绑定的前提
必须满足这个语法结构才能激活运行时分派:
- 声明为父类/接口类型(如
Animal a) - 实际创建的是子类实例(如
new Dog()) - 通过该引用调用被重写的方法(如
a.sound())


















