[英]Does the object of superclass created when object of derived class is created?
[英]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.