摘要:今天去某東面試一個特基礎(chǔ)特簡單的問題竟然一不小心腦子短路給答錯了,太懊惱了,記下以至警告問題如下現(xiàn)有基類,的構(gòu)造函數(shù)中輸出,中有一靜態(tài)塊內(nèi)輸出,的一個派生類的構(gòu)造函數(shù)中輸出類中的靜態(tài)塊中輸出。
今天去某東面試一個特基礎(chǔ)特簡單的問題竟然一不小心腦子短路給答錯了,太懊惱了,記下以至警告:
問題如下:
現(xiàn)有基類A,A的構(gòu)造函數(shù)中輸出“A Instance”,A中有一靜態(tài)塊內(nèi)輸出“A init”,A的一個派生類B的構(gòu)造函數(shù)中輸出“B instance”, B類中的靜態(tài)塊中輸出“B init”。問:A a = new B(); 輸出結(jié)果及正確的順序?
public class A{ static{ System.out.println("A init"); } public A(){ System.out.println("A Instance"); } } public class B extends A{ static{ System.out.println("B init"); } public B(){ System.out.println("B Instance"); } }
如果是這樣呢:A[] sca = new B[10]; 這是什么也不會輸出的。
總結(jié)一些其他的情況:
public class SuperClass{ static{ System.out.println("SuperClass init"); } public static int value = 123; } public class SubClass extends SuperClass{ static{ System.out.println("SubClass init"); } public static final String HELLOWORD = "hellow word"; } public class NotInitialization{ public static void main(String[] args){ /** * 這里只會輸出“SuperClass init”, 而不會輸出“SubClass init”. * 對于靜態(tài)字段,只有直接定義這個字段的類才會被初始化 * 因此通過子類引用父類中定義的靜態(tài)字段,只會觸發(fā)父類的初始化不會觸發(fā)子類的初始化 */ System.out.println(SubClass.value); /* * 這里也不會輸出“SubClass init”, * 這里因為雖然在Java源代碼中引用了SubClass類中的常量HELLOWORD, * 但是在編譯階段通過常量傳播優(yōu)化, * 已經(jīng)將此常量的值“hellow word”放到了NotInitialization類的常量池中, * 以后NotInitialization對常量 SubClass.HELLWORD 的引用實際都被轉(zhuǎn)化為NotInitialization類對自身常量池的引用了 */ System.out.println(SubClass.HELLOWORD); } }
總結(jié):
對于類的初始化虛擬機規(guī)范中明確指出有且只有一下五中情況會立即執(zhí)行對類的初始化: 1、遇到 new、getstatic、putstatic或invokestatic 著四條指令時,這四條指令分別代表: 使用new關(guān)鍵字實例化對象、讀取或設(shè)置靜態(tài)字段、調(diào)用一個類的靜態(tài)方法。 2、使用jav.lang.reflect包中的方法對類進(jìn)行反射調(diào)用。 3、當(dāng)初始化一個類的時候,如果該類的父類沒有初始化,則需要先初始化起父類 4、當(dāng)虛擬機啟動時,用戶需要指定一個要執(zhí)行的主類(包括main()方法的那個類),虛擬機會先初始化這個主類 5、使用jdk1.7的動態(tài)語言支持時,如果一個java.lang.MethodHandle實例最后的解析結(jié)果是:REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,且這個方法句柄所對應(yīng)的類沒有初始化則需要先觸發(fā)其初始化
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/64895.html
摘要:本文首發(fā)于的博客轉(zhuǎn)載請注明出處與的區(qū)別作用對象是類的靜態(tài)方法,作用于當(dāng)前線程是類的成員方法,作用于對象本身作用調(diào)用方法,線程進(jìn)入休眠狀態(tài)調(diào)用方法,線程進(jìn)入阻塞狀態(tài)鎖的釋放不會釋放持有的鎖會釋放鎖喚醒自然喚醒或者顯式調(diào)用方法調(diào)用或者方法調(diào)用不 ????本文首發(fā)于cartoon的博客????轉(zhuǎn)載請注明出處:https://cartoonyu.github.io/c... java sl...
摘要:驗證驗證是連接階段的第一步,這一階段的目的是為了確保文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機的要求,并且不會危害虛擬機自身的安全。字節(jié)碼驗證通過數(shù)據(jù)流和控制流分析,確定程序語義是合法的符合邏輯的。 看過這篇文章,大廠面試你「雙親委派模型」,硬氣的說一句,你怕啥? 讀該文章姿勢 打開手頭的 IDE,按照文章內(nèi)容及思路進(jìn)行代碼跟蹤與思考 手頭沒有 IDE,先收藏,回頭看 (萬一哪次面試問...
摘要:原文地址游客前言金三銀四,很多同學(xué)心里大概都準(zhǔn)備著年后找工作或者跳槽。最近有很多同學(xué)都在交流群里求大廠面試題。 最近整理了一波面試題,包括安卓JAVA方面的,目前大廠還是以安卓源碼,算法,以及數(shù)據(jù)結(jié)構(gòu)為主,有一些中小型公司也會問到混合開發(fā)的知識,至于我為什么傾向于混合開發(fā),我的一句話就是走上編程之路,將來你要學(xué)不僅僅是這些,豐富自己方能與世接軌,做好全棧的裝備。 原文地址:游客kutd...
閱讀 3455·2023-04-26 02:31
閱讀 3621·2021-11-23 09:51
閱讀 1286·2021-11-17 09:33
閱讀 2436·2021-11-16 11:45
閱讀 2566·2021-10-11 11:12
閱讀 2406·2021-09-22 15:22
閱讀 2713·2021-09-04 16:40
閱讀 2569·2021-07-30 15:30