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

Java 使用超类的变量访问派生类的对象,java,class,extends,superclass,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 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”;尽管如此,我还是应该执行父方法。
你能给我解释一下幕后发生了什么吗。

你不应该得到“程序员-马拉·古普塔”的输出,因为你正在创建
作者
对象:

new Author();
Programmer
在本例中只是对对象的引用。此引用可以指向
程序员
及其子类的任何对象


但是,当您调用一个方法时,您在引用所指向的对象上调用它。也就是说,
Author
Programmer
是父类,
Author
Programmer
的子类。父类包含子类对象的引用,但只能调用父类中的方法


Programmer b
中,实际上有一个
Author
类的引用。这就是它调用
Author
类函数的原因。当通过超类引用调用重写的方法时,Java根据调用时引用的对象类型确定要执行该方法的哪个版本。因此,该确定是在运行时进行的

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


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

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

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

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

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

相关: