【深入java虛擬機(3)】:類初始化-編程開發(fā)技術(shù)

【深入java虛擬機(3)】:類初始化-編程開發(fā)技術(shù)

ID:30978820

大?。?0.00 KB

頁數(shù):3頁

時間:2019-01-05

【深入java虛擬機(3)】:類初始化-編程開發(fā)技術(shù)_第1頁
【深入java虛擬機(3)】:類初始化-編程開發(fā)技術(shù)_第2頁
【深入java虛擬機(3)】:類初始化-編程開發(fā)技術(shù)_第3頁
資源描述:

《【深入java虛擬機(3)】:類初始化-編程開發(fā)技術(shù)》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫

1、【深入Java虛擬機(3)]:類初始化-編程開發(fā)技術(shù)【深入Java虛擬機(3)】:類初始化原文出處:蘭亭風(fēng)雨類初始化是類加載過程的最后一個階段,到初始化階段,才真正開始執(zhí)行類中的Java程序代碼。虛擬機規(guī)范嚴(yán)格規(guī)定了有且只有四種情況必須立即對類進行初始化:?遇到new、getstatic>putstatic>invokestatic這四條7節(jié)碼指令時,如果類還沒冇進行過初始化,則需要先觸發(fā)其初始化。生成這四條指令最常見的Java代碼場景是:使用new關(guān)鍵字實例化對象吋、讀取或設(shè)置一?個類的靜態(tài)字段(static)吋(被static修飾乂被final修飾的,己在編譯期把結(jié)果放入常量

2、池的靜態(tài)字段除外)、以及調(diào)用一個類的靜態(tài)方法時。?使用Javadang.refect包的方法對類進行反射調(diào)用時,如果類還沒冇進行過初始化,則需要先觸發(fā)其初始化。?當(dāng)初始化一個類的時候,如果發(fā)現(xiàn)其父類還沒有進行初始化,則需要先觸發(fā)其父類的初始化。?當(dāng)虛擬機啟動時,用戶需要指定一個要執(zhí)行的主類,虛擬機會先執(zhí)行該主類。虛擬機規(guī)定只有這四種情況才會觸發(fā)類的初始化,稱為對一個類進行主動引用,除此之外所有引用類的方式都不會觸發(fā)其初始化,稱為被動引用。下面舉一些例子來說明被動引用。1、通過了類引用父類中的靜態(tài)字段,這時對了類的引用為被動引用,因此不會初始化子類,只會初始化父類classFath

3、er{publicstaticintm=33;static{System,out.printin(,z父類被初始化〃);}}classChildextendsFather{static{System,out.printin(z,子類被初始化〃);}}publicclassStaticTcst{publicstaticvoidmain(String[]args){System.out.println(Child.m);執(zhí)行后輸岀的結(jié)果如下:父類被初始化33對于靜態(tài)字段,只有直接定義這個字段的類才會被初始化,因此,通過其子類來引用父類中定義的靜態(tài)字段,只會觸發(fā)父類的初始化而不會觸發(fā)子

4、類的初始化。2、常量在編譯階段會存入調(diào)用它的類的常量池中,木質(zhì)上沒有一直接引用到定義該常量的類,因此不會觸發(fā)定義常量的類的初始化classConst{publicstaticfinalStringNAME=〃我是常量〃;static{System,out.printin(〃初始化Const類〃);}}publicclassFinalTest{publicstaticvoidmain(String[]args){System,out.printin(Const.NAME);}}執(zhí)行后輸出的結(jié)果如下:我是常量雖然程序屮引用了const類的常量NAME,但是在編譯階段將此常量的值“我是

5、常量”存儲到了調(diào)用它的類FinalTest的常量池中,對常量Const.NAME的引用實際上轉(zhuǎn)化為了FinalTest類對口身常量池的引用。也就是說,實際上FinalTest的Class文件Z屮并沒冇Const類的符號引用入口,這兩個類在編譯成Class文件后就不存在任何聯(lián)系了。3、通過數(shù)組定義來引用類,不會觸發(fā)類的初始化classConst{static{System,out.printin(,z初始化Const類〃);publicclassArrayTest{publicstaticvoidmain(String[]args){Const[]con二newConst[5];執(zhí)

6、行后不輸岀任何信息,說明Const類并沒有被初始化。但這段代碼里觸發(fā)了另一個名為“LLConst”的類的初始化,它是一個由虛擬機自動生成的、直接繼承于java.lang.Object的子類,創(chuàng)建動作由字節(jié)碼指令newarray觸發(fā),很明顯,這是一個對數(shù)組引用類型的初初始化,而該數(shù)組中的元素僅僅包含一個對Const類的引用,并沒有對其進行初始化。如果我們加入對con數(shù)組屮各個Const類元素的實例化代碼,便會觸發(fā)Const類的初始化,如下:classConst{static{System,out.printl初始化Const類〃);publicclassArrayTest{publ

7、icstaticvoidmain(String[]args){Const[]con二newConst[5];for(Consta:con)a=newConst();}}這樣便會得到如下輸出結(jié)果:初始化Const類根據(jù)四條規(guī)則的第一條,這里的new觸發(fā)了Const類。最后看一下接口的初始化過程與類初始化過程的不同。接口也有初始化過程,上面的代碼中我們都是用靜態(tài)語句塊來輸岀初始化信息的,而在接口中不能使用“stdtic{}”語句塊,但編譯器仍然會為接口生成類構(gòu)造器,用

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。