Java多态体现为父类引用指向子类对象,如Animal a = new Dog();编译时检查父类方法,运行时执行子类重写版本;调用子类特有方法需instanceof检查后向下转型。

这是 Java 中多态的典型体现,用父类类型声明变量,但实际指向子类创建的对象。
基本写法:声明父类类型,用子类构造器初始化
语法上就是把子类对象赋值给父类类型的引用变量:
- 父类类型 变量名 = new 子类构造器();
- 例如:Animal a = new Dog(); —— Animal 是父类,Dog 是其子类
- 注意:不能反过来写(如 Dog d = new Animal();),因为父类不具备子类特有成员
能调用哪些方法?看编译时类型,但运行时执行子类重写版本
编译器只允许调用父类中声明过的方法(包括继承来的);如果子类重写了该方法,运行时会执行子类的实现:
- a.speak(); 可以调用 —— 假设 Animal 有 speak() 方法,Dog 重写了它,运行时输出 “汪汪”
- a.bark(); 编译报错 —— bark() 是 Dog 特有方法,Animal 类型引用看不到
想用子类特有功能?需要向下转型(强制类型转换)
如果确定引用实际指向的是某个子类对象,可以转成子类类型再调用专属方法:
- 先检查:if (a instanceof Dog) { ... }
- 再转换:Dog d = (Dog) a;
- 之后就能调用:d.bark();
- 不加 instanceof 检查直接强转,可能抛出 ClassCastException
常见应用场景
- 集合统一管理不同子类对象:比如 List
animals = Arrays.asList(new Dog(), new Cat()); - 方法参数接收多种子类:定义 void feed(Animal pet),传入 Dog 或 Cat 都可以
- 框架设计中的策略模式、模板方法等,依赖父类抽象,由子类具体实现
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











