2017-05-09 148 views
2
package package1; 
public class MyClassA { 
    protected int size; 
    public MyClassA() { 
    } 
    protected int getAge() { 
     return 10; 
    } 
    public int callAge() { 
     return getAge(); 
    } 
} 

package package2; 
import package1.MyClassA; 
public class MyClassB extends MyClassA { 
    protected int getAge() { 
    return 20; 
    } 
    private int superesult() { 
     return super.callAge(); 
    } 
    public static void main(String args[]) { 
     MyClassB classb = new MyClassB(); 
     System.out.println(classb.getAge()); 
     System.out.println(classb.superesult()); 
    } 
} 

當我調用getAge和superresult方法我期待20 10作爲輸出,但代碼打印20 20.在此先感謝。爲什麼這段代碼打印20 20而不是20 10?

+4

因爲'getAge'被重寫。 –

+0

'superresult'在'MyClassA'中調用'callAge','callAge'調用重寫的方法'getAge'。 「MyClassB」中的覆蓋返回20.這就是重寫。 – khelwood

+0

「我期待20 10」你爲什麼期待這樣的結果? – Pshemo

回答

4

簡短的回答:你打電話,因爲它在A實現了callAge。但該方法調用getAge被覆蓋(因此Java遵循實現,如在B中完成的那樣)。

加長版

當你撥打:

classb.superesult(); 

它會調用super.callAge(),這樣就意味着A類的callAge()執行。 callAge()在他的部分調用getAge()但由於對象是類B的實例getAge()被覆蓋,它返回20

請注意,如果您致電super.foo(),您只能撥打超級富豪super因此並不意味着你「改變上下文」:超級調用所產生的所有調用仍然通過對象上的動態綁定來解析(並且該對象仍然是B的一個實例)。所有呼叫foo確實可以被覆蓋(除非這些被標記爲final)。這在大多數情況下是期望的行爲。

3

這是polymorphism。你有getAge()方法ovveridden。所以當你調用方法時,ovverdien方法總是執行。

Java虛擬機(JVM)爲每個變量中引用的對象調用適當的方法。它不調用變量類型定義的方法。這種行爲被稱爲虛擬方法調用,並演示了Java語言中重要多態特性的一個方面。

1

因爲您已經在子類中覆蓋了getAge()方法。現在,由於MyClassB classb = new MyClassB();指向子類,因此將調用其方法而不是父方法

相關問題