父类引用指向子类对象可实现多态,调用方法时执行子类重写版本,如Animal a = new Dog(); a.makeSound()输出"Dog barks";但访问子类特有成员需通过instanceof判断后向下转型,如(Dog) a调用bark方法,确保类型安全。

在Java中,父类引用指向子类对象是一种常见的多态表现形式。这种机制允许程序在运行时根据实际对象类型来调用相应的方法,而不是依据引用的类型。要正确实现并调用子类功能,需要理解继承、方法重写和多态的基本原理。
父类引用指向子类对象的基本语法
你可以使用父类类型声明一个引用变量,但让其指向一个子类实例:
Parent obj = new Child();
这里 obj 是 Parent 类型的引用,但它实际指向的是 Child 对象。这种方式是合法的,因为子类“是一个”父类(is-a关系)。
调用被重写的方法(动态绑定)
当父类和子类都定义了相同签名的方法时,如果子类重写了该方法,通过父类引用调用该方法会自动执行子类中的版本:
立即学习“Java免费学习笔记(深入)”;
- 方法调用在运行时根据实际对象类型决定,不是引用类型
- 这称为动态方法调度或运行时多态
示例:
本文档主要讲述的是Android JNI开发入门与提高;JNI在Android系统中有着广泛的应用。Android系统底层都是C/C++实现的,上层提供的API都是Java的,Java通过JNI调用底层的实现。比如:Android API多媒体接口MediaPlayer类,其实底层通过JNI调用libmedia库。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
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
访问子类特有成员的限制与解决方式
父类引用不能直接访问子类独有的方法或属性:
- 只能调用父类中声明过的方法或字段
- 若需调用子类特有成员,必须进行向下转型(cast)
例如:
Animal a = new Dog();
// a.bark(); // 编译错误:Animal 没有 bark 方法
if (a instanceof Dog) {
Dog d = (Dog) a;
d.bark(); // 正确:现在可以调用子类特有方法
}
建议在转型前使用 instanceof 判断类型,避免 ClassCastException。
总结关键点
实现父类引用调用子类对象的核心在于:
- 利用继承建立父子关系
- 通过方法重写实现多态行为
- 运行时自动调用子类重写的方法
- 如需访问子类独有成员,需安全地进行类型转换
基本上就这些。掌握这一点,就能写出更灵活、可扩展的面向对象代码。









