Java例項化 new 的本質

2021-07-09 11:51:38 字數 1147 閱讀 2274

1:尋找類定義

jvm會在自己的乙個名叫「方法區」的記憶體塊中,尋找名叫「myobject」的class物件(注意class也是乙個物件,該物件記錄了所有類的定義),如果有,則按照class物件的定義,生成乙個myobject物件。 

2:載入類定義

如果「方法區」中沒有名為「myobject」的class物件,jvm會用當前類的類載入器(classloader)從當前的classpath路徑尋找名為"myobject.class"的檔案,如果找到,則將檔案進行分析,轉換為class物件存放在「方法區」中,否則丟擲「classnotfoundexception」。對於jdk的class,jvm啟動時,會用啟動類載入器載入,對於使用者的class,則會用應用程式類載入器實時載入,所謂實時載入,指的是遇到的時候再載入,而不是預先一次性載入。關於類載入器,有**,jvm嚴格的限制了每一級的載入許可權,載入模式為「雙親委託模式」,載入任何類,都先由父載入器載入。 

3:給物件分配記憶體空間

找到myobject的類定義後,jvm在記憶體「堆」中,開闢乙個空間,該空間按照myobject類定義開闢,並將該空間中的各個記憶體段設定預設值,對應的就是物件的屬性初始化預設值。 

4:物件的初始化順序

物件的初始化都先從父類開始,順序如下: 

給父類靜態變數預設值 

對父類靜態變數賦值 

執行父類靜態塊 

給當前類靜態變數預設值 

對當前類靜態變數賦值 

執行當前類靜態塊 

給父類變數預設值 

對父類變數賦值 

執行父類建構函式 

給當前類變數預設值 

對當前類變數賦值 

執行當前類建構函式 

5:物件構造完成

注:當new乙個string的時候,只是生成乙個string物件,而沒有生成object物件,object的類定義在「方法區」這塊記憶體中,當new string的時候,jvm會檢查string的父類,找出父類的定義,並找出哪些是string可以擁有的,然後按照篩選出來的父類定義和string本身的類定義,在堆中分配乙個記憶體塊(就是俗稱的生成了乙個物件),而沒有專門為string的父類object分配空間。 

JAVA例項化的本質

1 尋找類定義 jvm會在自己的乙個名叫 方法區 的記憶體塊中,尋找名叫 myobject 的class物件 注意class也是乙個物件,該物件記錄了所有類的定義 如果有,則按照class物件的定義,生成乙個myobject物件。2 載入類定義 如果 方法區 中沒有名為 myobject 的clas...

Java中new關鍵字使物件例項化的的兩種寫法

物件例項化可以如下兩種方法來表示 一 物件名 new 類名 引數1,引數2.引數n 物件名.方法 二 new 類名 引數1,引數2.引數n 方法 用乙個簡單的 來說明使物件例項化的的兩種寫法 package new public class wordtest public static void m...

例項的初始化過程 new 物件

類的載入過程 1.jvm會先去方法區中找有沒有相對應類的.class存在。如果有就直接使用,如果沒有,則把相關類的.class 載入到方法區 2.在.class載入到方法區時,會分為兩部分載入 先載入非靜態內容,再載入靜態內容 3.載入非靜態內容 把.class中的所有非靜態內容載入到方法區下的非靜...