繁体   English   中英

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

[英]Using a variable of a superclass to access an object of a derived 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();
}

按照这段代码,我得到这样的输出“作者 - Mala Gupta”; 尽管如此,我应该执行父级的方法。 你能向我解释一下幕后发生了什么吗?

您不应该得到“程序员 - Mala Gupta”输出,因为您正在创建Author对象:

new Author();

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

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

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

Programmer b实际上有一个Author类的引用。 这就是它调用Author类函数的原因。 它称为Polymorphism

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM