2013-10-08 79 views
0

在Java中如何實現繼承?例如,考慮一下:在Java中如何實現繼承?

class A { 
    public void foo() { 
     System.out.print("A"); 
    } 
} 
class B extends A { 
    ... 
} 
class Test { 
    public static void main(String[] args) { 
     B test = new B(); 
     test.foo(); // how is foo() called? 
} 

線下,將編譯器只轉儲A.foo()的定義爲B類的身體嗎?像

class B extends A { 
    ... 
    public void foo() { 
     System.out.print("A"); 
    } 
} 

或者是foo以某種方式在A類中查找並在那裏調用?

+1

'B.foo()'不會首先編譯,因爲它不是一個靜態方法。你的意思是'test.foo()'? (但不,編譯器不會複製方法實現...) –

+0

B.foo();根本不編譯。 –

+0

糟糕。我的意思是test.foo();檢查更新的版本。 –

回答

2

方法體不會複製到未定義的子類的方法體中。相反,當你致電

B test = new B(); 
test.foo(); 

它會看起來低谷的層次結構,每次找不到實現時都會上升到一個水平。 首先它會檢查B哪些沒有實現。高於此水平的是A,因此它會使用那一個。

+1

至少在理論上。我希望虛擬機會爲每種類型構建一次查找表,以使其更有效,但效果是一樣的。 –

+0

我認爲繼承是通過使用設計模式鏈的責任來實現的,當編譯器找到重定義時,它將方法的代碼放在類中,當它沒有找到重定義時,它會生成一個委託給基類的方法類相當於super.foo(); –

3

這也許能夠幫助你,說明從書艾弗霍頓的Begining的Java 7

我在本章派生類擴展基類的開頭說。這不只是行話 - 它 真的這樣做。正如我多次說過的那樣,繼承關於派生類中基類的成員是 ,而不是基類的成員在派生類對象中存在。 子對象包含原始基類的所有成員,以及在派生類中定義的所有新成員 。如圖6-3所示。

enter image description here