[英]Method calling using reference variable
public class Base {
int var =0;
Base(){
System.out.println("Inside Base constructor .....");
setVar();
}
public void setVar(){
System.out.println("Inside base setVar method.....");
var+=10;
}
public int getVar(){
return var;
}
}
派生类:
public class Derived extends Base {
Derived(){
System.out.println("Inside Derived constructor .....");
setVar();
}
public void setVar(){
System.out.println("Inside Derived setVar method.....");
var+=20;
}
public static void main(String[] args){
Base b = new Derived();
System.out.println(b.getVar());
}
}
输出.....
Inside Base constructor .....
Inside Derived setVar method.....
Inside Derived constructor .....
Inside Derived setVar method.....
40
问题---->为什么当控制权交给基类构造函数时,将调用派生类的setVar()方法而不是基类setVar()方法。 我期望输出为30,但是当在调试模式下运行该程序时,发现该流并获得了40的输出。任何人都可以解释其背后的逻辑。 谢谢
Java将根据变量的运行时类型(即始终使用多态)来决定要运行哪种方法,即使调用的方法来自基类构造函数也是如此。
调用基类构造函数时,多态意味着调用派生类的setVar
版本,并添加20。 然后,调用派生类的构造函数,并再次调用派生类的setVar
版本,并再次添加20,得到40。
工作中的多态性。
当您覆盖派生类中的超类方法时,当有人对派生类的任何对象进行操作时,即使该人是超类,也总是会调用派生类中被覆盖的方法。
因此, Derived
setVar()
被调用了两次,因为它在“ Derived
”中被覆盖,并且您尝试创建“ Derived
”类的对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.