簡體   English   中英

使用引用變量的方法調用

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM