Java中一個物件的創建分兩步: 加載類,創建物件:
java類的加載程序:

java中物件的創建程序:

加載類是將所寫的程式.java檔案編譯生成的.class檔案加載到記憶體中,保證了物件創建的預置環境,類加載完畢后才可以創建該類的物件,
第一步:加載類
當開始運行一個類,虛擬機首先試圖訪問指定啟動類的 .main() 方法,加載該類的 .class 檔案,
如果該類有父類,那么繼續加載其父類,以此類推,直到加載出所有與main入口類相關的類(它的父類,父類的父類等),
接著,從其頂級父類開始,對其static域按照順序進行初始化!直至初始化完所有類的static域,>將static域放到靜態存盤區,
至此類的加載作業完畢了,下面就進入main函式,執行main函式,一般main函式中來創建類的物件,如果發現要創建的類沒有被加載,則繼續加載該類)
第二步:物件創建
為物件獲取記憶體,然后將記憶體全部置為0,此時物件中的所有屬性都是被賦予0的默認值(記憶體為0時候的默認值:null-物件參考,0-int,false-boolean…)> 在堆中生成物件所需空間,全部初始化為0,具體成員屬性值為堆上對應記憶體子塊–正是因為這種機制,所以java可以保證所有的類物件的屬性都會被初始化,但是區域不會被初始化, 這里需要注意的是:一個物件內部組合了另一個物件,那么在堆中其實存的也是一個參考,這個參考指向被組合物件的堆記憶體地址(另外再創建), 當參考在記憶體的二進制資料都為0的時候,他的表現形式是null;當他指向的資料內容記憶體區資料都是0的時候,他的值為0,"",False等初始標準值,所謂初始化就是修改記憶體區的二進制資料,因為物件在創建時候第一步就將記憶體清0,所以保證了所有屬性都能至少被初始化為標準初值! 但是區域變數不一樣,你不初始化,只是申明,那么開辟的記憶體區在堆疊中值會是一個未知資料(一旦使用該參考的話,使用的可能是你沒有初始化而瞎幾把亂指的地址)所以Java會代碼檢驗的時候發現你使用了未初始化的參考,直接給予不通過,直接杜絕了這種可能性的發生, 綜上,Java中使用任何變數或參考,必須初始化,初始化就是將記憶體中舊的二進制資料要么清0,要么賦予你要賦的值!
從頂級父類開始,按照申明順序將給頂級父類的非static的成員屬性初始化(static的只初始化一次在類加載階段)> 用屬性定義的值覆寫0值,
呼叫頂級父類的建構式,如果有成員屬性初始化則覆寫前一個申明時初始化值,> 建構式再次初始化,覆寫前面申明時初始化,
以此類推,將所有的父級(先初始化屬性,在呼叫構造,一層一層的構造完畢) 構造完成
最后,初始化當前類的非static屬性,再呼叫當前類的建構式,完成所有初始化作業,
注意:
- 類中static部分是發生在類加載時期的,并且只初始化一次,因為類只加載一次,加載完后創建物件程序中不會再去初始化static部分的東西,所以之后根本不會再走那塊初始化代碼,又怎么初始化第二次呢?
- static的優先級是高于main函式執行的,因為它是在類加載時期初始化,當static作用的東西都加載完了才執行main,當然main是第一個被使用的static方法,但是虛擬機只是找到這個方法的位置,并不會先去執行里面的內容,
- 對于類的普通成員屬性初始化三個步驟:先全初始化為0,再用申明時候初始化值進行初始化,再呼叫建構式進行初始化,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/458538.html
標籤:其他
