"父类引用指向子类对象"是Java(以及许多其他面向对象的编程语言)的一个基本概念,与多态(Polymorphism)密切相关。为了更好地理解这个概念,我们首先分解它,然后通过示例进行解释。
1. 父类引用
这意味着你声明了一个变量,其类型是某个类(称为父类或超类)。
Parent parent;
2. 子类对象
子类(或称为派生类)是从另一个类(父类)继承的类。当你创建一个子类的实例或对象时,你实际上得到了一个包含子类属性和父类属性的对象。
Child child = new Child();
3. 父类引用指向子类对象
你可以使用父类的引用来引用子类的对象。
Parent parent = new Child();
这是有效的,因为子类是父类的一个扩展。这意味着子类对象同时也是一个父类对象(is-a关系)。
多态的实现
使用父类引用指向子类对象是多态的核心。当你通过父类引用调用一个被子类重写的方法时,Java的运行时多态机制将确保调用的是子类的方法版本,而不是父类的。
考虑以下示例:
class Parent {
void display() {
System.out.println("Display method in Parent class.");
}
}
class Child extends Parent {
@Override
void display() {
System.out.println("Display method in Child class.");
}
}
public class TestPolymorphism {
public static void main(String[] args) {
Parent obj = new Child();
obj.display(); // Outputs: Display method in Child class.
}
}
在上述代码中,尽管obj
的类型是Parent
,但实际引用的对象是Child
类的实例。因此,当调用obj.display()
时,运行时多态机制确保调用的是Child
类的display
方法。
对于多态,可以总结它为:
一、使用父类类型的引用指向子类的对象;
二、该引用只能调用父类中定义的方法和变量;
三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)
四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。
多态的3个必要条件:
1.继承 2.重写 3.父类引用指向子类对象。
注意
虽然父类引用可以引用子类对象,但父类引用只能访问父类中声明的属性和方法,不能直接访问子类特有的方法或属性。如果需要访问子类特有的功能,你可能需要进行类型转换。