要理解類載入和類初始化,必須了解類的生命週期,類的生命週期可簡要概括為五個階段,即載入、連線、初始化、使用、銷毀五個階段。類載入通常指類生命週期的前三個階段:
載入階段:
載入階段就是把經過編譯後的位元組碼檔案載入進記憶體,即把類資訊載入進jvm的方法區中,並在堆中建立乙個class物件,來作為類資訊的入口。
類載入的時機和虛擬機器的實現有關,有的實現是在類被使用之前就進行載入,有的是在只有使用的時候才去載入,我們常用的虛擬機器就採用了後面這種實現。
連線階段:
連線階段可細分為:驗證、準備、解析三個階段。
驗證: 驗證載入的類是否合法,jvm能否正常執行。
準備:給類的靜態變數設定初值(基本型別為 0 引用型別為null 常量型別為我們在程式裡定義的初值)
初始化階段:
連線階段過後,就是類的初始化階段了。
類的初始化階段是執行類構造器()
方法 。在這個階段只會初始化與類相關的**,即用static關鍵字修飾的部分。
如果存在父類,會按照順序先呼叫父類的類構造器。
例項化(使用類來建立物件):
乙個物件的建立需要經歷類初始化和例項化兩個部分,剛才已經講過類的初始化過程了,現在來理一下類例項化過程,首先來講一下物件建立的幾種方式,或者說是物件建立的時機:
1、使用new關鍵字建立
2、使用反射機制建立
3、使用clone()方法建立
4、通過序列化、反序列化,建立
當我們使用上述幾種方法建立物件的時候,首先jvm會給物件分配記憶體來存放自己的例項變數和從父類繼承過來的例項變數,分配記憶體的同時給這些變數賦預設值,分配記憶體過後就會進行物件的初始化,分別是例項變數、例項**塊、建構函式的初始化。
建構函式在編譯後會被命名成()
方法,乙個類被例項化之前,必須先例項化其父類(object類是所有類的父類)。例項變數和例項**塊在初始化的過程中是會放到建構函式裡的,在父類的構造方法呼叫之後,類本身的建構函式**之前。
在乙個類的生命週期裡,()
只會執行一次,而()
可能會執行多次。
類初始化和例項初始化
乙個類要建立例項需要先載入並初始化該類 main方法所在的類需要先載入和初始化 乙個子類要初始化需要先初始化父類 乙個類初始化就是執行clinit 方法 clinit 方法由靜態類變數顯式賦值 和靜態 塊組成 類變數顯式賦值 和靜態 塊 從上到下順序執行 clinit 方法只執行一次 父類的初始化 ...
類初始化和例項初始化
father public class father father public inttest public static intmethod son public class sonextends father son public inttest public static intmethod...
類初始化 例項初始化 方法重寫
乙個類要建立例項需要先載入並初始化該類 乙個子類要初始化需要先初始化父類 乙個類初始化就是執行 clinit 方法 例項初始化就是執行 init 方法 哪些方法不可以被重寫 物件的多型性 父類 author barrylee 2018年11月10日 下午3 52 33 public class fa...