子類建立物件時記憶體分配解析

2021-06-28 03:34:40 字數 837 閱讀 6542

我們根據下面這段**來進行解析:

class fu

public int getnum() }

class zi extends fu

}class testdemo

}

分析**如下圖所示:

(1)虛擬機器(jvm)尋找到testdemo.class檔案後將其載入到記憶體中。

(2)主函式main()入棧,在棧中定義zi型別的引用z,this,由於zi有父類,定義乙個fu型別的引用super,這三個引用都初始化為null。

(3)要想給zi類分配物件,要把其父類fu放入方法區中,再把本來放入方法區中。

(4)在堆記憶體中分配一塊記憶體(由new方法得到),由於子類繼承了父類的成員變數,所以在該記憶體塊中定義從父類中繼承來的變數num2和num2,並初始化為0,我們稱這塊包含父類成員的記憶體塊為子父類物件。

(5)在該記憶體塊中為子類成員變數分配空間並預設初始化。

(6)呼叫方法區中子類建構函式zi(),該函式入棧。在函式體的第一行呼叫了父類的建構函式fu(),fu()入棧對子父類初始化,在進行父類的顯示初始化,子父類物件初始化完畢後把位址賦給super。

(7)繼續執行下面的建構函式體,建構函式結束後進行子類的顯示初始化。

(8)將物件的位址賦給this和z。

(1)子類繼承了其父類中不是私有的成員變數和成員方法,作為自己的成員變數和方法。

(2)子類中定義的成員變數和父類中定義的成員變數相同時,則父類中的成員變數不能被繼承。

(3)子類中定義的成員方法,並且這個方法的名字返回型別,以及引數個數和型別與父類的某個成員方法完全相同,則父類的成員方法不能被繼承。

子類建立物件

因為子類是繼承自父類,所以在為子類建立物件之前,其會先後的為父類的靜態全域性變數 子類的靜態全域性變數進行初始化,之後再先後為父類的例項全域性變數 子類的例項全域性變數進行初始化。1.子類要為父類的私有屬性單獨的在堆裡開闢空間,這個空間不屬於任何乙個物件,原因是私有屬性要使用必須要有個空間,並預設初...

分清楚父類物件和子類物件的記憶體分配

一.背景 之前一直對類記憶體分布和物件真正的記憶體分布沒有清楚的理解.看到類記憶體分布時,子類中的變數有一部分是來自父類的,就認為在生成父類物件和子類物件時,他們共有的變數在記憶體上是重疊的.後來想了一下,應該不是這麼回事,就實地考察了下.二.舉例驗證 有如下的繼承關係,有分別定義了對應的物件,考察...

記憶體分配時對齊

下面的 載自libxml中的xmlmemmory.c ifdef sun4 define align size 16 else define align size sizeof double endif define hdr size sizeof memhdr define reserve siz...