小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Java類中各種靜態(tài)變量的加載順序的學(xué)習(xí)

 Mis林桑 2017-03-20

最近在補(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)我一直想不明白...

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多