父类引用指向子类对象可实现多态,调用方法时执行子类重写版本,如Animal a = new Dog(); a.makeSound()输出"Dog barks";但访问子类特有成员需通过instanceof判断后向下转型,如(Dog) a调用bark方法,确保类型安全。
在Java中,父类引用指向子类对象是一种常见的多态表现形式。这种机制允许程序在运行时根据实际对象类型来调用相应的方法,而不是依据引用的类型。要正确实现并调用子类功能,需要理解继承、方法重写和多态的基本原理。
你可以使用父类类型声明一个引用变量,但让其指向一个子类实例:
Parent obj = new Child();
这里 obj 是 Parent 类型的引用,但它实际指向的是 Child 对象。这种方式是合法的,因为子类“是一个”父类(is-a关系)。
当父类和子类都定义了相同签名的方法时,如果子类重写了该方法,通过父类引用调用该方法会自动执行子类中的版本:
示例:
class Animal {
void makeSound() {
System.out.println("Animal makes sound");
}
}
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Dog barks");
}
}
// 使用
Animal a = new Dog();
a.makeSound(); // 输出: Dog barks
父类引用不能直接访问子类独有的方法或属性:
例如:
Animal a = new Dog();
// a.bark(); // 编译错误:Animal 没有 bark 方法
if (a instanceof Dog) {
Dog d = (Dog) a;
d.bark(); // 正确:现在可以调用子类特有方法
}
建议在转型前使用 instanceof 判断类型,避免 ClassCastException。
实现父类引用调用子类对象的核心在于:
基本上就这些。掌握这一点,就能写出更灵活、可扩展的面向对象代码。