Java多态的核心是向上转型和向下转型:向上转型自动安全但限制访问子类成员,向下转型需instanceof校验以防ClassCastException;动态绑定仅适用于@Override实例方法,字段访问看编译类型,方法调用看运行类型。

Java 多态的核心落地方式就是向上转型和向下转型,它们不是语法糖,而是运行时行为的控制开关。理解清楚这两者,才能真正掌握“编译看父类、运行看子类”的本质。
向上转型:安全、自动、限制访问
向上转型是把子类对象赋给父类引用,比如 Animal a = new Dog();。这个过程不需要强制转换,JVM 保证它一定成功。
- 编译时类型是左边的父类(Animal),所以只能调用 Animal 中声明的方法
- 运行时类型是右边的真实对象(Dog),所以调用重写方法时执行的是 Dog 的实现
- 无法访问子类独有的方法或字段,比如 Dog 的 fetch() 或 barkLevel
- 常见场景包括:变量直接赋值、方法参数传入、方法返回值包装
向下转型:需显式、有风险、依赖 instanceof
当需要调用子类特有功能时,必须将父类引用还原为子类类型,例如 Dog d = (Dog) a;。但这种转换可能失败,必须提前校验。
- 不加判断直接强转,若实际对象不是目标类型,会抛出 ClassCastException
- 推荐写法是先用 if (a instanceof Dog) 判断,再转型
- instanceof 检查的是对象真实的运行时类型,不是引用类型
- 注意:不能跨继承链转型,比如 Animal 转成 Cat 可以,但转成 String 不合法
动态绑定才是多态真正的引擎
向上转型本身只是“让引用看起来像父类”,真正决定执行哪段代码的,是 JVM 在运行时根据对象真实类型做的方法分派。
立即学习“Java免费学习笔记(深入)”;
- 只有被 @Override 修饰的实例方法才参与动态绑定
- 静态方法、private 方法、final 方法、构造方法都不支持多态,它们走静态绑定
- 成员变量不参与多态——访问哪个字段,只看编译时类型,不是运行时类型
- 所谓“编译看左边,运行看右边”,指的就是字段访问 vs 方法调用的差异
典型误用与避坑要点
很多初学者卡在转型逻辑上,问题往往出在对类型关系的理解偏差。
- 误以为 Animal a = new Dog() 后 a 就“变成 Dog 类型”了——其实它仍是 Animal 引用,只是指向 Dog 实例
- 忽略 instanceof 直接向下转型,导致线上偶发崩溃
- 试图对 null 做 instanceof 判断——结果是 false,不会报错,但容易漏掉空指针逻辑
- 在构造方法中调用可重写方法,此时子类字段可能还未初始化,引发未定义行为


















