在Java面向对象编程中,父类引用指向子类对象是指使用父类类型来声明一个变量,但实际让这个变量引用一个子类实例。这种写法正是多态的基础,也是日常开发中接口和抽象类得以灵活运用的关键。

什么是父类引用指向子类对象
简单来说,如果有一个父类Animal和两个子类Dog、Cat,我们可以写出如下代码:
class Animal {
void sound() {
System.out.println("动物叫");
}
}
class Dog extends Animal {
void sound() {
System.out.println("汪汪");
}
}
class Cat extends Animal {
void sound() {
System.out.println("喵喵");
}
}
public class Test {
public static void main(String[] args) {
// 父类引用指向子类对象
Animal a1 = new Dog();
Animal a2 = new Cat();
a1.sound(); // 输出:汪汪
a2.sound(); // 输出:喵喵
}
}
上面代码中,变量a1和a2的编译时类型都是Animal,但运行时类型分别是Dog和Cat。
为什么这样写是多态
多态指同一个行为具有多个不同表现形式。父类引用指向子类对象后,调用重写方法时会根据实际对象类型执行对应逻辑,而不是看引用类型。这称为动态绑定或运行时绑定。
- 编译时:编译器只检查父类是否有该方法
- 运行时:JVM根据实际对象类型决定调用哪个子类方法
方法调用规则
通过父类引用只能直接调用父类中声明过的成员,不能调用子类独有方法。如果子类重写了父类方法,则执行子类版本。
| 引用类型 | 对象类型 | 可调用方法 | 重写方法执行 |
|---|---|---|---|
| 父类 | 子类 | 父类声明的方法 | 子类重写版 |
| 父类 | 子类 | 子类独有方法(需强转) | 不适用 |
访问子类独有方法
若确实需要调用子类特有功能,可以进行向下转型:
Animal a = new Dog();
// a.fetch(); // 编译错误,父类没有fetch
if (a instanceof Dog) {
Dog d = (Dog) a;
// 假设Dog有fetch方法
// d.fetch();
}
典型应用场景
1. 方法参数使用父类类型
可以让方法接收任意子类对象,提升复用性:
void makeSound(Animal a) {
a.sound();
}
2. 集合存储不同子类
使用父类或接口类型的集合统一管理工作对象:
List<Animal> list = new ArrayList<>();
list.add(new Dog());
list.add(new Cat());
for (Animal a : list) {
a.sound();
}
注意事项
父类引用指向子类对象时,如果父类方法是静态的,则不具备多态性,调用看引用类型。另外成员变量也没有多态,访问的是父类字段。理解这些边界能避免误用。
总结:父类引用指向子类对象是Java实现多态的核心语法,掌握它有助于写出易扩展、低耦合的代码。
Java多态父类引用指向子类对象修改时间:2026-07-28 11:24:24