使用超类的变量访问派生类的对象

时间:2019-03-26 11:48:00

标签: java class extends superclass

我正在尝试解决此问题。当使用父类引用来引用子类时,我们将调用父类的方法。

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”的输出;尽管我应该执行父方法。 您能告诉我幕后发生的事情吗?

4 个答案:

答案 0 :(得分:2)

您不应获得“ Programmer-Mala Gupta”的输出,因为您正在创建Author对象:

new Author();
在这种情况下,

Programmer只是对该对象的引用。并且此引用可以指向Programmer及其子类的任何对象。

但是,当您调用方法时,将在引用所指向的对象上调用它。那就是Author

答案 1 :(得分:0)

Programmer是父类,AuthorProgrammer的子类。父类包含子类对象的引用,但是您只能调用父类中的那些方法。

实际上,在Programmer b中有一个Author类的引用。这就是为什么它调用Author类函数的原因。它叫做Polymorphism

答案 2 :(得分:0)

当通过超类引用调用重写的方法时,Java根据调用发生时所引用的对象的类型来确定要执行该方法的版本。因此,该确定是在运行时进行的。

所引用的对象的类型(而不是引用变量的类型)确定将执行哪个版本的重写方法。

因此,如果超类包含被子类覆盖的方法,则当通过超类引用变量引用不同类型的对象时,将执行该方法的不同版本。这就是为什么要获得输出的原因:作者-Mala Gupta

答案 3 :(得分:0)

该概念与运行时多态性相关联。在这里,引用变量“ b”属于父类(程序员),而对象属于子类(作者)。

现在,参考变量“ b”指向子(作者)类。

print()方法有两个定义,一个定义属于Programmer,另一个定义属于Author类。要调用的方法的确定是基于引用变量所引用的对象。调用函数的过程将在运行时解决。

因此,每当调用b.print()时,您都会得到如下输出: