2015-05-05 81 views
0
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.任何人都可以請解釋這背後的邏輯。 謝謝

回答

0

即使調用的方法來自基類構造函數,Java也會根據變量的運行時類型(即使用多態性)決定運行哪種方法。

當調用基類構造函數時,多態性意味着調用派生類的setVar版本,並添加20。然後調用派生類的構造函數,並再次調用派生類的setVar版本,並且再次添加20,產生40個。

+0

在你的答案我有兩個疑惑:1>這意味着如果在主要方法,即使我改變基地b =新派生()派生d =新派生()同樣的事情會發生? 2>如何使用派生類對象調用Base類的setVar()方法? –

+0

1.是的,只有運行時類型很重要。 2.從調用類方法的代碼中,重寫的方法是不可訪問的。從代碼內部到類,你可以調用'super.setVar();'。 – rgettman

+0

「從調用類方法的代碼中,重寫的方法是不可訪問的。」你能否詳細說明你的陳述? –

0

工作中的多態性。

當您在派生類中重寫超類方法時,即使某人是超類,某人在派生類的任何對象上操作時,總是會在派生類中重寫您的重寫方法。

是因爲它是在「Derived」覆蓋DerivedsetVar()被稱爲兩次,你試圖建立「Derived」類的對象。