我正在尝试解决此问题。当使用父类引用来引用子类时,我们将调用父类的方法。
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();
}
在这段代码之后,我得到类似“ Author-Mala Gupta”的输出;尽管我应该执行父方法。 您能告诉我幕后发生的事情吗?
答案 0 :(得分:2)
您不应获得“ Programmer-Mala Gupta”的输出,因为您正在创建Author
对象:
new Author();
在这种情况下, Programmer
只是对该对象的引用。并且此引用可以指向Programmer
及其子类的任何对象。
但是,当您调用方法时,将在引用所指向的对象上调用它。那就是Author
。
答案 1 :(得分:0)
Programmer
是父类,Author
是Programmer
的子类。父类包含子类对象的引用,但是您只能调用父类中的那些方法。
实际上,在Programmer b
中有一个Author
类的引用。这就是为什么它调用Author
类函数的原因。它叫做Polymorphism
。
答案 2 :(得分:0)
当通过超类引用调用重写的方法时,Java根据调用发生时所引用的对象的类型来确定要执行该方法的版本。因此,该确定是在运行时进行的。
所引用的对象的类型(而不是引用变量的类型)确定将执行哪个版本的重写方法。
因此,如果超类包含被子类覆盖的方法,则当通过超类引用变量引用不同类型的对象时,将执行该方法的不同版本。这就是为什么要获得输出的原因:作者-Mala Gupta
答案 3 :(得分:0)
该概念与运行时多态性相关联。在这里,引用变量“ b”属于父类(程序员),而对象属于子类(作者)。
现在,参考变量“ b”指向子(作者)类。
print()方法有两个定义,一个定义属于Programmer,另一个定义属于Author类。要调用的方法的确定是基于引用变量所引用的对象。调用函数的过程将在运行时解决。
因此,每当调用b.print()时,您都会得到如下输出: