父类引用指向子类对象这句话是什么意思

203 阅读2分钟

父类引用指向子类对象”是 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)把父类引用还原为子类类型(需要显式转换)
多态同一个接口有不同的实现方式
使用场景当你想统一处理多个子类对象,比如集合中存储不同类型的对象