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

问题描述 投票:2回答:4

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

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'这样的输出;尽管如此我应该执行父方法。你能告诉我幕后发生了什么吗?

java class extends superclass
4个回答
2
投票

你不应该得到'Programmer - Mala Gupta'输出,因为你正在创建Author对象:

new Author();

在这种情况下,Programmer只是对象的引用。这个引用可以指向Programmer及其子类的任何对象。

但是,当您调用方法时,可以在引用指向的对象上调用它。这就是Author


0
投票

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

Programmer b实际上有一个Author类的参考。这就是为什么它称为Author类功能。它被称为Polymorphism


0
投票

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

它是被引用的对象的类型(不是引用变量的类型),它确定将执行被覆盖方法的哪个版本。

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


0
投票

这个概念与运行时多态性相关联。这里,引用变量“b”属于父类(Programmer),对象属于子类(Author)。

现在,引用变量“b”指向子(Author)类。

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

因此,无论何时调用b.print(),您都将获得输出:

© www.soinside.com 2019 - 2024. All rights reserved.