父类引用指向子类对象是java多态的核心机制,即用父类类型声明变量但以子类实例赋值(如animal a = new dog()),编译时看引用类型,运行时根据实际对象类型动态绑定方法调用,必须满足继承、重写、向上转型三条件。

Java 中的多态,核心就体现在“父类引用指向子类对象”这一机制上。它不是语法糖,而是面向对象三大特性之一(封装、继承、多态)的关键落地方式,让程序更灵活、可扩展。
什么是父类引用指向子类对象
就是用父类类型声明一个变量,但实际用 new 子类() 来赋值。例如:
Animal a = new Dog(); // Animal 是父类,Dog 是子类 a.speak(); // 运行时调用的是 Dog 类重写的 speak() 方法
这里 a 的编译时类型是 Animal,运行时类型是 Dog。JVM 在运行时根据实际对象类型决定调用哪个方法——这就是动态绑定(后期绑定),也是多态的根基。
必须满足的三个条件
- 有继承关系:子类 extends 父类,或实现同一接口(接口多态同理)
- 有方法重写(Override):子类重写了父类的非 private、非 static、非 final 方法
-
父类引用指向子类对象:如
Parent p = new Child();,且通过该引用调用重写的方法
能调用哪些成员?要注意什么
父类引用只能访问编译时类型声明中存在**的成员:
- ✅ 可以调用父类中定义的方法(包括被子类重写的方法)——运行时体现多态
- ✅ 可以访问父类中 public / protected 的字段(但字段不具有多态性,访问的是父类声明的字段值)
- ❌ 不能直接调用子类独有的方法或字段(编译报错),除非强制向下转型:
((Dog)a).fetch() - ⚠️ 静态方法和静态字段看的是引用类型(即父类),不是实际对象类型,所以不参与多态
为什么设计成这样?好处在哪
本质是解耦与扩展:
- 方法参数、返回值、集合元素类型可以统一用父类/接口,比如
void feed(Animal a),传入 Dog、Cat、Bird 都可以 - 新增子类(如新增 Duck)无需修改原有调用逻辑,只要遵守父类契约
- 配合抽象类或接口,能清晰定义行为规范,由子类具体实现
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











