java類的實例化(instantiation)具有顯性的和隱性的區別。
一般編程時,我們鎖使用new的方法實例化,這是最簡單直接的顯性實例化。另外還有三種實例化,分別為反射機制中的newInstance()方法,類的clone()方法 和 解串行化使用的ObjecInputStream中的getObject()方法。
而隱性的實例化則出現在java程序的整個生命周期中,包括String 、 Class ,StringBuffer 或者StringBuilder的實例化。
詳細內容如下:
顯性的實例化:
1.直接使用new關鍵字創建新的對象。
調用相應的構造函數完成實例化。(類中的非靜態成員變量如果有初始化語句,都會被隱式的加入到構造函數中)代碼如下:
關鍵在於LDC"xyz"這條指令,明顯可以看出,這是用於strA初始化的字符串。
由此我們可以歸納出,在沒有調用 本類中其他的構造函數的情況下,每次類的構造函數中都會按如下順序進行:
a)隱式(或顯性)的調用父類的構造函數,
b)然後執行寫在構造函數外的成員變量的初始化賦值
c)最後再執行構造函數中的命令。
如果是有顯性的調用本類其他構造函數(必須是放在構造函數第一步執行),那麼對於這個構造函數,處理過程就簡單些了:
a)調用那個構造函數。
b)執行之後的代碼。
至於為什麼一定要將另外一個構造函數放在構造函數的第一步:必須先處理好heap中的變量初始化後才能下一步執行。