類加載的時(shí)機(jī)和初始化的時(shí)機(jī)
摘自:https://www.cnblogs.com/javaee6/p/3714716.html
類加載的時(shí)機(jī):
-
Java核心類庫(如rt.jar)
在虛擬機(jī)啟動(dòng)的時(shí)候進(jìn)行預(yù)加載训措,各個(gè)類庫被不同的ClassLoader所加載- Bootstrap ClassLoader/啟動(dòng)類加載器
主要負(fù)責(zé)jdk_home/lib目錄下的核心 api 或 -Xbootclasspath 選項(xiàng)指定的jar包裝入工作. - Extension ClassLoader/擴(kuò)展類加載器
主要負(fù)責(zé)jdk_home/lib/ext目錄下的jar包或 -Djava.ext.dirs 指定目錄下的jar包裝入工作
- Bootstrap ClassLoader/啟動(dòng)類加載器
-
用戶自己定義的類
在虛擬機(jī)啟動(dòng)的時(shí)候被加載- System ClassLoader/系統(tǒng)類加載器
主要負(fù)責(zé)java -classpath/-Djava.class.path所指的目錄下的類與jar包裝入工作
體現(xiàn)了Java語言的動(dòng)態(tài)性灯蝴,在合適的時(shí)候被加載進(jìn)JVM中 - User Custom ClassLoader/用戶自定義類加載器(java.lang.ClassLoader的子類)
在程序運(yùn)行期間, 通過java.lang.ClassLoader的子類動(dòng)態(tài)加載class文件, 體現(xiàn)java動(dòng)態(tài)實(shí)時(shí)類裝入特性.
- System ClassLoader/系統(tǒng)類加載器
類初始化的時(shí)機(jī):
1. 新建對(duì)象實(shí)例
2. 訪問靜態(tài)變量和靜態(tài)方法時(shí)
3. 使用java.lang.reflect進(jìn)行反射調(diào)用時(shí)
4. 初始化一個(gè)類時(shí)崎页,其父類還沒有進(jìn)行初始化
5. 虛擬機(jī)啟動(dòng)時(shí)妒挎,定義main()方法的那個(gè)類先初始化
初始化類的執(zhí)行順序
摘自:https://www.cnblogs.com/Qian123/p/5713440.html
-
一般順序
- 靜態(tài)變量聲明,靜態(tài)代碼塊
- 普通變量聲明仇让,代碼塊
- 構(gòu)造函數(shù)
-
包含繼承
- 父類靜態(tài)代碼塊典奉,子類靜態(tài)代碼塊
- 父類代碼塊,父類構(gòu)造函數(shù)
- 子類代碼塊丧叽,子類構(gòu)造函數(shù)
-
包含main()方法
- 包含main()方法的類的靜態(tài)塊
- main()方法
- 根據(jù)main()方法中的聲明按需加載
只有涉及到實(shí)例對(duì)象才會(huì)去執(zhí)行代碼塊和構(gòu)造函數(shù)卫玖,否則初始化階段只會(huì)執(zhí)行靜態(tài)變量賦值,靜態(tài)代碼塊(即clinit()方法)