在 Java 中,父类引用可以指向子类对象,这是多态的一种表现。这种特性允许你使用父类的引用来操作子类对象,从而实现更灵活和可扩展的代码设计。
基本概念
多态:父类引用可以指向子类对象。这使得你可以用统一的接口处理不同的对象。
动态绑定:调用方法时,Java 会在运行时确定实际调用的是哪个类的方法(即子类的重写方法)。
示例代码
java
Copy Code
// 定义父类
class Animal {
void makeSound() {
System.out.println("Some sound");
}
}
// 定义子类
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Bark");
}
}
// 使用父类引用指向子类对象
public class Main {
public static void main(String[] args) {
Animal myAnimal = new Dog(); // 父类引用指向子类对象
myAnimal.makeSound(); // 调用子类的重写方法
}
}
解释
声明父类引用:Animal myAnimal;
实例化子类对象并赋值给父类引用:myAnimal = new Dog();
调用方法:当调用 myAnimal.makeSound() 时,Java 会动态绑定到 Dog 类的 makeSound 方法,因为 myAnimal 实际上引用的是 Dog 对象。
优势
代码复用:可以编写通用的代码来处理不同的子类。
灵活性:可以在运行时改变对象的实际类型。
注意事项
向上转型:将子类对象赋给父类引用时,称为向上转型(upcasting)。这通常是安全的,因为子类对象包含父类的所有特性。
向下转型:如果需要使用子类特有的方法或属性,需要将父类引用向下转型(downcasting)。但必须确保实际对象确实是目标子类的实例,否则会抛出 ClassCastException。
java
Copy Code
Animal myAnimal = new Dog(); // 向上转型
Dog myDog = (Dog) myAnimal; // 向下转型,必须确保类型匹配
myDog.bark(); // 访问 Dog 特有的方法
总结来说,父类引用指向子类对象是面向对象编程中的一个核心概念,它允许你编写更灵活和可扩展的代码。