“父类引用指向子类对象”是 Java 面向对象编程中的一个核心概念,它体现了 多态(Polymorphism) 的思想。
🧠 一、什么是“父类引用指向子类对象”?
我们来拆解这句话:
- 父类引用:指的是用父类类型声明的变量。
- 指向子类对象:这个变量实际引用的是子类创建的对象。
✅ 示例代码:
java
深色版本
class Animal {
public void makeSound() {
System.out.println("Animal sound");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Woof!");
}
}
然后你这样写:
java
深色版本
Animal a = new Dog(); // 父类引用指向子类对象
a.makeSound(); // 输出:Woof!
这里:
a是一个Animal类型的变量(父类引用)- 它指向的是一个
Dog对象(子类对象)
这就是所谓的 父类引用指向子类对象。
🔍 二、为什么可以这样做?
因为 Java 中有一个规则:
子类是一种特殊的父类,所以可以用父类类型的变量来引用子类对象。
这在面向对象中叫做 向上转型(Upcasting) 。
向上转型是自动发生的,不需要强制转换。
💡 三、这种写法有什么好处?(多态的意义)
多态的核心意义在于:
同一个接口,不同的实现。
也就是说,你可以用统一的方式去调用方法,但根据对象的实际类型执行不同的行为。
示例说明:
java
深色版本
Animal a1 = new Dog();
Animal a2 = new Cat();
a1.makeSound(); // Woof!
a2.makeSound(); // Meow
虽然你都是通过 Animal 类型的变量调用 makeSound() 方法,但由于实际对象不同(Dog / Cat),它们的行为也不同。
⚠️ 四、不能访问子类独有的方法
如果你在子类中定义了父类没有的方法,就不能通过父类引用直接访问。
例如:
java
深色版本
class Dog extends Animal {
public void wagTail() {
System.out.println("Wagging tail...");
}
}
Animal a = new Dog();
a.wagTail(); // ❌ 编译错误!Animal 类中没有 wagTail 方法
这时候你需要进行 向下转型(Downcasting) :
java
深色版本
Dog d = (Dog) a;
d.wagTail(); // ✅ 正确
但要注意:如果 a 实际不是 Dog 类型,运行时会抛出 ClassCastException。
✅ 五、总结一句话
“父类引用指向子类对象”是指:用父类类型的变量去引用一个子类创建的对象,从而实现多态行为,这是 Java 多态性的基础。
| 概念 | 含义 |
|---|---|
| 向上转型(Upcasting) | 父类引用指向子类对象(自动完成) |
| 向下转型(Downcasting) | 把父类引用还原为子类类型(需要显式转换) |
| 多态 | 同一个接口有不同的实现方式 |
| 使用场景 | 当你想统一处理多个子类对象,比如集合中存储不同类型的对象 |