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