父类引用指向子类实例体现“编译看类型、运行看对象”:编译期检查声明类型,运行时动态绑定重写方法;字段访问无多态,子类独有成员不可见;static、private、final方法不参与多态。

父类引用变量指向子类实例,本质是“编译看类型、运行看对象”的分工机制。它不是让变量变聪明了,而是 Java 编译器和 JVM 各司其职的结果:左边声明决定你能写什么(编译期检查),右边 new 出来的对象决定最终执行谁的方法(运行时调度)。
变量的“眼睛”和“腿”是分开的
父类引用就像一副只配了父类镜片的眼镜——它能看见父类定义的所有 public/protected 方法和字段,但它的“腿”(实际行为)由真实对象决定。
- ✅ 调用重写过的方法(如 sound()):走动态绑定,执行子类版本
- ✅ 访问父类字段(如 name):拿到的是父类中定义的那个值(字段无多态)
- ❌ 调用子类独有方法(如 bark()):编译直接报错,因为“眼镜”根本看不到它
- ❌ 访问子类同名字段:即使子类也定义了 name,通过父类引用读取的仍是父类字段的值
动态绑定只对特定方法生效
不是所有方法都会在运行时切换实现。JVM 只对满足条件的实例方法做动态分派:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 必须是非 private、非 static、非 final 的实例方法
- 子类必须显式 @Override 父类中已有的方法
- 静态方法(static)和私有方法(private)按引用声明类型绑定,不参与多态
为什么这样设计?关键在解耦
这种机制让调用方不用关心具体是哪个子类,只依赖父类或接口契约:
- 方法参数用 Animal pet,传 new Dog() 或 new Cat() 都合法
- 集合存成 List
,遍历时统一调 pet.sound(),无需 if-else 判断类型 - 新增 Duck 类只要继承 Animal 并重写 sound(),原有代码完全不用改
常见踩坑点提醒
看似简单,但几个细节容易出错:
- 强制转型(如 (Dog) a)前必须用 instanceof 判断,否则运行时抛 ClassCastException
- 字段访问永远按编译类型来,哪怕子类有同名字段,也拿不到子类值
- 构造器、静态方法、final 方法不会动态绑定,它们的调用目标在编译期就锁死了
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










