Java 類的載入過程

2021-08-14 06:57:17 字數 1791 閱讀 2971

棧:用來執行函式。可以儲存區域性資訊

堆:用來儲存new出來的實體 (特點:每乙個實體所開闢的空間都有乙個位址;每乙個實體中儲存的資料都有乙個預設初始值)

方法區:存放.class和static (方法區其實是由n多個小的區域構成。有存放非靜態內容的非靜態區域,還有存放靜態內容的靜態區域,還有存放常量的常量池等)

jvm會先去方法區中找有沒有相應類的.class存在。如果有,就直接使用;如果沒有,則把相關類的.class載入到方法區

在.class載入到方法區時,會分為兩部分載入:先載入非靜態內容,再載入靜態內容

1). 把.class中的所有非靜態內容載入到方法區下的非靜態區域內

2). 載入靜態內容:

2.2.1. 把.class中的所有靜態內容載入到方法區下的靜態區域內

2.2.2. 對所有的靜態變數進行預設初始化

2.2.3. 對靜態變數進行顯式初始化

2.2.4. 執行靜態**塊

在堆記憶體中開闢一塊空間

給開闢空間分配乙個位址

把物件的所有非靜態成員載入到所開闢的空間下

對所有非靜態成員變數進行預設初始化

呼叫建構函式,分為兩部分:

先執行建構函式中的隱式三步,再執行建構函式中書寫的**。

1)隱式三步:

1,執行super語句

2,對開闢空間下的所有非靜態成員變數進行顯式初始化

3,執行構造**塊

2)執行建構函式中書寫的**把空間分配的位址賦值給乙個引用物件

舉例

class

person

} class

student

extends

person

}

a:將person.class檔案載入到記憶體中。

b:在堆記憶體中建立乙個物件person。

c:把person中的屬性進行預設初始化。

d:把person中的屬性進行顯式初始化。

e:呼叫構造**塊

f:呼叫建構函式進行初始化。

g:在棧記憶體中宣告person型別的變數p。

h:把堆記憶體的位址(引用)賦給了棧記憶體中p。

class singleton 

public

static singleton getinstance()

}public

class test

}

列印:

count1=1

count2=0

分析:

1.singleton singleton = singleton.getinstance();呼叫類singleton的靜態方法,觸發了類的初始化

2. 類載入時在準備過程中為類的靜態變數分配記憶體並初始化預設值 singleton=null count1=0,count2=0

3. 類初始化後,為類的靜態變數賦值和執行靜態**快。singleton賦值為new singleton()呼叫類的構造方法

4. 呼叫類的構造方法後count1和count2都要自增加1,因此count=1 count2=1

5. 執行列印語句:繼續為count1與count2賦值,此時count1沒有賦值操作,因此count1為1,但是count2執行賦值操作就變為0

Java 類載入過程

1 載入 載入的過程本質上是乙個讀取二進位制資料的過程。可以是檔案,網路資料,記憶體中的資料等,這一階段是可以自定義的。載入過程中會在堆中初始化乙個 class 物件。2 驗證 驗證就是驗證這堆二進位制資料是不是有效的,就是這個 class 資料是否可以載入虛擬機器。例如驗證檔案是否是 0xcafe...

java類的載入過程

以person person new person 為例進行說明 1 因為new用到了person.class,所以會先找到person.class檔案,並載入到記憶體中 2 執行該類中的static 塊,如果有的話,給person.class類進行初始化 3 在堆記憶體中開闢空間分配記憶體位址 4...

類的載入過程

類的載入過程 1 在建立物件時,會先判斷物件所屬的型別 類 在記憶體中是否存在,如果存在則直接使用 如果不存在,則把類載入到記憶體中的方法區下 2 在把類 class 載入到方法區時,分兩種情況 2.1 從.class檔案的上面向下依次載入內容 2.2 靜態的內容載入到方法區的靜態區域下 非靜態內容...