使用 superclass 的变量访问派生 class 的 object

Using a variable of a superclass to access an object of a derived class

我正在尝试解决这个问题。当使用 parent class 引用引用 child class 时,我们调用 parent class 的方法。

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';尽管如此,我还是应该执行 parent 的方法。 你能给我解释一下幕后发生的事情吗?

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

new Author();

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

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

Programmer 是父级 class,AuthorProgrammer 的子级。父 class 包含子 class 对象的引用,但您只能调用父 class.

中的那些方法

Programmer b里面居然有Authorclass的引用。这就是它调用 Author class 函数的原因。它叫做 Polymorphism.

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

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

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

这个概念与运行时多态性相关联。这里,引用变量"b"属于parentclass(程序员),object属于childclass(作者)。

现在,引用变量 "b" 指向 child(作者)class。

print() 方法有两种定义,一种属于程序员,一种属于作者 class.The 要调用的方法的确定是基于 object 所引用的参考变量。调用函数的过程将在 运行 时间解决。

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