我正在尝试这个问题来解决这个问题。使用父类引用引用子类时,我们调用父类的方法。
class Programmer {
void print() {
System.out.println("Programmer - Mala Gupta");
}
}
class Author extends Programmer {
void print() {
System.out.println("Author - Mala Gupta");
}
}
class TestEJava {
Programmer a = new Programmer();
Programmer b = new Author();
b.print();
}
按照这段代码,我得到像'作者 - Mala Gupta'这样的输出;尽管如此我应该执行父方法。你能告诉我幕后发生了什么吗?
你不应该得到'Programmer - Mala Gupta'输出,因为你正在创建Author
对象:
new Author();
在这种情况下,Programmer
只是对象的引用。这个引用可以指向Programmer
及其子类的任何对象。
但是,当您调用方法时,可以在引用指向的对象上调用它。这就是Author
。
Programmer
是父类,Author
是Programmer
的孩子。父类包含子类对象的引用,但您只能调用父类中的那些方法。
在Programmer b
实际上有一个Author
类的参考。这就是为什么它称为Author
类功能。它被称为Polymorphism
。
当通过超类引用调用重写方法时,Java根据调用发生时引用的对象类型确定要执行该方法的哪个版本。因此,该确定在运行时进行。
它是被引用的对象的类型(不是引用变量的类型),它确定将执行被覆盖方法的哪个版本。
因此,如果超类包含被子类覆盖的方法,则当通过超类引用变量引用不同类型的对象时,将执行该方法的不同版本。这就是你获得输出的原因:作者 - Mala Gupta
这个概念与运行时多态性相关联。这里,引用变量“b”属于父类(Programmer),对象属于子类(Author)。
现在,引用变量“b”指向子(Author)类。
print()方法有两个定义,一个属于Programmer,另一个属于Author类。要调用的方法的确定基于引用变量引用的对象。调用函数的过程将在运行时解析。
因此,无论何时调用b.print(),您都将获得输出: