JAVA例項化的本質

2021-07-23 02:06:19 字數 1147 閱讀 7168

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例項化 new 的本質

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

Java之類例項化的順序

在建立乙個物件例項時,是如何一步步的進行 執行的呢,一般來說,順序如下 1.首先是父類的靜態變數和靜態 塊 看兩者的書寫順序 2.第二執行子類的靜態變數和靜態 塊 看兩者的書寫順序 3.第三執行父類的成員變數賦值 4.第四執行父類類的構造 塊 5.第五執行父類的構造方法 6.執行子類的構造 塊 7....

Java類的例項化順序

類的例項化順序,比如父類靜態資料,建構函式,字段,子類靜態資料,建構函式,字段,他們的執行順序 先靜態 先父後子 先靜態 父靜態 子靜態 優先順序 父類 子類 靜態 塊 非靜態 塊 建構函式 乙個類的例項化過程 1,父類中的static 塊,子類的static 2,順序執行父類的普通 塊 3,父類的...