[英]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.