1. 程式人生 > >深入java (類)建構函式和物件建立的記憶體分配

深入java (類)建構函式和物件建立的記憶體分配

之前的文章總結了java一些較為常用的關鍵字,現在我們要進入到類裡面,總結類的特徵(其中包括了記憶體和建構函式,gc垃圾回收),java中類的繼承和初始化順序(會涉及到ClassLoader),java多型的深入,java抽象類、介面的深入理解和例子。今天從類開始。原創不易,轉載請註明出處:http://blog.csdn.net/yabay2208

  • 從計算機原理角度初探java類物件使用的堆和棧
  • java類建構函式

一:從計算機原理角度初探java類物件使用堆和棧

在我們瞭解建立物件真正發生之前,需要對生存在java中的事物更加了解,我們需要更加了解java的堆(heap,物件生存的空間)和棧(stack,方法呼叫和變數生存的空間)。當java虛擬機器啟動的時候,他會從底層的作業系統取得一塊記憶體來執行java程式,至於記憶體的大小和你是否可以呼叫取決與JVM的平臺和版本。所有物件都存在與可垃圾回收的堆記憶體上。
例項變數:

宣告在類裡面而不是方法裡,存活在堆記憶體中,被物件呼叫,生命週期和物件一起存亡。別名叫:成員變數。

區域性變數:定義在方法中,存活在棧記憶體中,被方法使用,生命週期和方法一起存亡。

靜態變數:宣告在類裡面而不是方法裡,存活在方法區中,被類和物件使用,生命週期和類一起存亡。


方法如何被呼叫?
我們進一步探究當方法迭代呼叫時:是如何在記憶體中排列的。用一個例子配合圖片說明:

public void firstStep(){
    boolean b = true;
    secondStep(2);
}
public void secondStep(int x){
    int
s = x + 100; thredStep(); } public void thredStep(){ List list = new ArrayList(); list.add(1); list.add(2); list.add(3); }

我們分析一下記憶體中是如何使用這一段程式碼:
第一步:
當某段程式呼叫firstStep()使得firstStep()被放在棧記憶體最上方的棧塊中,同時這個棧塊中有boolean b,且值為true;

第二步:
firstStep()呼叫secondStep使得secondStep被放在棧記憶體最上方的棧塊中,同時這個棧塊中有x和z;

第三步:
secondStep呼叫thredStep()使得thredStep()被放在棧記憶體最上方的棧塊中,同時這個棧塊中有list控制代碼,同時list控制代碼會指向在堆記憶體中建立的new ArrayList(),”=”號將list控制代碼和堆記憶體進行連結。進行add操作後,堆空間多出來了1,2,3的空間;

第四步:
thredStep()執行完畢之後,thredStep()出棧,list立刻被銷燬,new出來的物件等待被gc回收;執行回到secondStep(),secondStep()執行完畢之後,出棧,s和x立刻被銷燬;執行回到firstStep(),firstStep()執行完畢後,出棧,b被銷燬。執行完畢。

配圖片說明:
這裡寫圖片描述

二:java類建構函式

對這個知識點做一個總結:

1:建構函式是我們在新建一個物件的時候會用到的函式:new …

2:建構函式名稱必須和類名一樣,而且沒有返回值。

3:建構函式如果我們沒有宣告,那麼程式在編譯期的時候,編譯器會自動給我們新增一個沒有引數的建構函式。

4:建構函式的一般功能是:對類的例項變數進行初始化操作。構造有特定屬性的物件。

5:建構函式可以過載,但是不能有相同的引數型別和順序。

限於篇幅,下一篇總結:java中類的繼承,繼承關係中生成子類物件時:建構函式會如何執行才可以確保繼承的子類可以準確無誤保留父類的屬性。