Java類初始化時(shí)機(jī)測(cè)試方法解析
<clinit>()方法
Java 類加載的初始化過程中,編譯器按語句在源文件中出現(xiàn)的順序,依次自動(dòng)收集類中的所有類變量的賦值動(dòng)作和靜態(tài)代碼塊中的語句合并產(chǎn)生方法。 如果類中沒有靜態(tài)語句和靜態(tài)代碼塊,那可以不生成<clinit>() 方法。
并且 <clinit>() 不需要顯式調(diào)用父類(接口除外,接口不需要調(diào)用父接口的初始化方法,只有使用到父接口中的靜態(tài)變量時(shí)才需要調(diào)用)的初始化方法 <clinit>(),虛擬機(jī)會(huì)保證在子類的 <clinit>() 方法執(zhí)行之前,父類的 <clinit>() 方法已經(jīng)執(zhí)行完畢(所以java.lang.Object 類總是第一個(gè)被加載)
準(zhǔn)備父類和子類
class Father { static int father_a = 1; static { System.out.println('父類靜態(tài)代碼塊執(zhí)行'); } static class StaticInnerClass { static { System.out.println('靜態(tài)內(nèi)部類靜態(tài)代碼塊執(zhí)行'); } }}class Son extends Father { static { System.out.println('子類靜態(tài)代碼塊執(zhí)行'); son_a = 300; } static int son_a = 100; static final int M = 1;}
Main方法:
1:父類沒有被引用但是會(huì)被先加載
new Son();
2:反射也會(huì)產(chǎn)生主動(dòng)引用:
Class a = Class.forName('clinit.Son');
(運(yùn)行結(jié)果同1)
3:子類使用父類靜態(tài)變量或方法不會(huì)產(chǎn)生類的引用
System.out.println('Father.a = ' + Son.father_a);
4:通過類創(chuàng)建數(shù)組不會(huì)加載類(只是開辟一塊空間)
Son[] sons = new Son[8];
5:使用常量不會(huì)加載父類和之類(常量在Linking階段就保存在常量池當(dāng)中了)
System.out.println('Son.CONST = ' + Son.CONST);
6:引用靜態(tài)內(nèi)部類不會(huì)加載外部類(應(yīng)用于單例模式)
new Father.StaticInnerClass();
代碼總結(jié):
public static void main(String[] args) throws Exception {// 1.父類沒有被引用但是會(huì)被先加載// new Son();// 2.反射會(huì)產(chǎn)生主動(dòng)引用// Class a = Class.forName('clinit.Son');// 3.子類使用父類靜態(tài)變量或方法不會(huì)產(chǎn)生類的引用// System.out.println('Father.a = ' + Son.father_a);// 4.通過類創(chuàng)建數(shù)組不會(huì)加載類(只是開辟一塊空間)// Son[] sons = new Son[8];// 5.使用常量不會(huì)加載父類和之類(常量在Linking階段就保存在常量池當(dāng)中了)// System.out.println('Son.CONST = ' + Son.CONST);// 6.引用靜態(tài)內(nèi)部類不會(huì)加載外部類(應(yīng)用于單例模式)// new Son.StaticInnerClass(); }}
PS:由于是按出現(xiàn)的順序執(zhí)行的,為了避免不必要的麻煩,應(yīng)盡量把靜態(tài)變量寫在靜態(tài)代碼塊之前
public class Test { public static void main(String[] args) { System.out.println('a = ' + cls.a); }}class cls { static int a = 10;8 static { a = 20; }9 }
如果 調(diào)換順序輸出結(jié)果將是 a = 10
class cls { static { a = 20; } static int a = 10; }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. XML實(shí)體注入深入理解2. XML入門的常見問題(三)3. WMLScript腳本程序設(shè)計(jì)第1/9頁4. Xpath語法格式總結(jié)5. XML 非法字符(轉(zhuǎn)義字符)6. 前端html+css實(shí)現(xiàn)動(dòng)態(tài)生日快樂代碼7. CSS3實(shí)例分享之多重背景的實(shí)現(xiàn)(Multiple backgrounds)8. 不要在HTML中濫用div9. 利用CSS3新特性創(chuàng)建透明邊框三角10. CSS Hack大全-教你如何區(qū)分出IE6-IE10、FireFox、Chrome、Opera
