2015-08-27 40 views
3

我想了解JVM內部如何實現繼承。 在我看來,如果我們有以下代碼:Java:新的繼承和對象編號

class A { 
    int aa; 
} 

class B extends A{ 
    int bb; 
} 
.... 
B b=new B(); 

的JVM三個對象內將被創建:

對象的 B
  1. (與現場int bb
  2. A的對象(帶域int aa
  3. 對象Object

當然,程序員只能看到類B的一個對象。我對嗎?或者只有一個對象創建內部JVM

我想什麼:

新返回參考B。爲什麼我認爲是這樣(例如),如果我們覆蓋B中的A的一些方法,我們可以始終使用super。除了在默認的構造函數B中,第一行將調用默認的構造函數A,我們可以在該對象存在的情況下調用特定對象的構造函數。因此存在單獨的A對象?

+0

是否有你不想爲你的問題使用'jvm'或'inheritance'標籤的原因?請賜教 – User42

+0

@ User42謝謝。我添加了這些標籤。 –

+0

關鍵字'new'在字節碼中創建一個對象。多維數組是個例外。 –

回答

3

起初,spec says表示對象的內部結構沒有被指定,因此從理論上講,JVM可以在內部創建多個對象對象,其中B僅包含B新的字段,以及指向A對象的鏈接,其中包含A的字段。

它還說了一些有關Oracle JVM實現的內容:類實例包含三個指針。一個是方法表,一個是實例字段的數據所在的堆中的一個空間,另一個是實例所屬的Class對象。

可以得出結論:對於每個創建的對象,只有一個實例,即B的實例。此實例的方法表包含來自B,A和Object的所有方法以及堆空間包含來自B,A(和對象)的字段的所有數據。

0

這裏只會創建一個對象。它是B對象。但B對象具有A對象的狀態和行爲。由於每個類的超類型都是Object類,所以B對象也具有Object的狀態和行爲。謝謝

0

類代表一種類型的對象,但只有實例創建真實的對象。因此只有一個對象被創建並且它對應於類B與類A的合併結果。