|
最近在補(bǔ)《thinking in java》...有一節(jié)提到了加載類需要做的一些準(zhǔn)備...我照著書本敲了一下代碼...同時(shí)稍微修改了一下書本上的代碼.... package charpter14; import java.util.Random; class Initable{ static{ System.out.println('haha'); } static final int staticFinal = 47; static final int staticFinal2 = ClassInitialization.rand.nextInt(1000); static{ System.out.println('Initialing Initable'); } } class Initable2{ static int staticNonFinal = 147; static{ System.out.println('Initialing Initable2'); a = 1; } static int a = 7; } class Initable3{ static int staticNonFinal = 74; static{ System.out.println('Initialing Initable3'); } } public class ClassInitialization { public static Random rand = new Random(47); public static void main(String[] args) throws Exception { Class initable = Initable.class; System.out.println('After creating Initable ref'); System.out.println(Initable.staticFinal); System.out.println(Initable.staticFinal2); System.out.println(Initable2.staticNonFinal); Class initable3 = Class.forName('charpter14.Initable3'); System.out.println('After creating Initable3 ref'); System.out.println(Initable3.staticNonFinal); System.out.println(Initable2.a); } } 輸出結(jié)果:After creating Initable ref 47 haha Initialing Initable 258 Initialing Initable2 147 Initialing Initable3 After creating Initable3 ref 74 7 分析Class initable = Initable.class;的時(shí)候什么都沒(méi)有輸出,說(shuō)明了調(diào)用.class的時(shí)候并不會(huì)初始化Initable類.47 haha Initialing Initable 258; 調(diào)用Initable.staticFinal的時(shí)候因?yàn)閟taticFinal變量是static final 并且是 基本數(shù)據(jù)類型字面值,不是通過(guò)方法得到的值的時(shí)候也不會(huì)初始化這個(gè)類. 調(diào)用staticFinal2的時(shí)候,因?yàn)檎{(diào)用了其他類的方法,所以要先初始化Initable這個(gè)類,所以會(huì)去做static區(qū)塊的內(nèi)容.因此會(huì)輸出haha 和 Initialing Initable,然后初始化完畢,再輸出258.調(diào)用Initable2.staticNonFinal的時(shí)候,因?yàn)檫@個(gè)變量不是final類型的,所以要先初始化類,所以去做static區(qū)塊,因此輸出Initialing Initable2以后再輸出47. 問(wèn)題最后我想一個(gè)問(wèn)題,這點(diǎn)有點(diǎn)奇怪....我有點(diǎn)想不明白...輸出Initable2.a的值是7不是1.說(shuō)明了Initable2的static區(qū)塊中的a=1是先于賦值static int a = 7執(zhí)行的...這里有個(gè)問(wèn)題就是..既然如此的話那執(zhí)行a=1的時(shí)候a變量的類型都是不確定的為什么能賦值呢...我想可能是因?yàn)閟tatic int a = 7的時(shí)候..第一步做的是static int a=0,就是先分配空間,沒(méi)有賦值; 然后執(zhí)行static區(qū)塊,賦值a = 1,這樣a的類型就確定了,能賦值.然后再執(zhí)行a = 7.如果確實(shí)是這樣的話..那還是有一個(gè)問(wèn)題.....(Σ( ° △ °|||)︴問(wèn)題好多啊).....public class Test { static{ a = 99; System.out.println(a); } static int a = 11;} 如果剛才的推論是正確的話這里應(yīng)該會(huì)輸出99....因?yàn)橄冉oa分配空間,再賦值a=99;再輸出a,就是99...然后再賦值a=11..... 可是實(shí)際上eclipse會(huì)提示你這里有編譯錯(cuò)誤.. eclipse會(huì)告訴你Cannot reference a field before it is defined. 它會(huì)告訴你a是沒(méi)有定義的,所以你這里不能輸出a.... 這點(diǎn)我一直想不明白... |
|
|