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中的所有非靜態內容載入到方法區下的非靜...