面試官:如何用一段代碼證明JVM加載類(lèi)是懶加載模式
你知道的越多,不知道的就越多,業(yè)余的像一棵小草!
你來(lái),我們一起精進(jìn)!你不來(lái),我和你的競(jìng)爭(zhēng)對(duì)手一起精進(jìn)!
編輯:業(yè)余草
jiannan.blog.csdn.net
推薦:https://www.xttblog.com/?p=5340
面試官提問(wèn),如何用一段代碼證明JVM加載類(lèi)是懶加載模式?
假如有一天,你要找工作,等到了面試邀請(qǐng),來(lái)到了面試公司,做完了筆試題,迎來(lái)了面試官。

面試官的第一個(gè)問(wèn)題確是:你如何用一段代碼證明在JVM加載類(lèi)是懶加載模式?

來(lái)來(lái)來(lái),都坐下,先看看這段代碼,思考一下結(jié)果。
public?class?SuperClass?{
????static?{
????????System.out.println("SuperClass?init");
????}
????public?static?int?value?=?10;
}
class?SubClass?extends?SuperClass?{
????static?{
????????System.out.println("SubClass?init");
????}
}
class?TestClass?{
????public?static?void?main(String[]?args)?{
????????System.out.println(SubClass.value);
????}
}
上述代碼,只會(huì)輸出:
SuperClass?init
10
而不會(huì)輸出SubClass init,對(duì)于靜態(tài)字段,只有直接定義這個(gè)字段的類(lèi)才會(huì)被初始化,因此通過(guò)其子類(lèi)來(lái)引用父類(lèi)中定義的靜態(tài)字段,只會(huì)觸發(fā)父類(lèi)的初始化,而不會(huì)初始化子類(lèi)。
所以就能證明JVM加載類(lèi)是懶加載模式,?我們?cè)賮?lái)看看其他的情況。
public?class?NotInitialization?{
????public?static?void?main(String[]?args)?{
????????//?SuperClass?引用上面代碼的類(lèi)
????????SuperClass[]?superClasses?=?new?SuperClass[10];
????}
}
上面這段代碼,創(chuàng)建了一個(gè)引用類(lèi)型的數(shù)組,請(qǐng)問(wèn)SuperClass會(huì)被初始化么?
“噢,這里都直接new了,肯定會(huì)被初始化呀~~”

答案是不會(huì)、不會(huì)、不會(huì)~~
再來(lái)看最后一段代碼,想想ConstClass中的stataic靜態(tài)代碼塊會(huì)被執(zhí)行么?
public?class?ConstClass?{
????static?{
????????System.out.println("ConstClass?init");
????}
????public?static?final?String?HELLOWORLD?=?"hello?world";
}
class?ConstTest?{
????public?static?void?main(String[]?args)?{
????????System.out.println(ConstClass.HELLOWORLD);
????}
}
運(yùn)行結(jié)果也沒(méi)有輸出“ConstClass init”,這是因?yàn)殡m然在Java代碼中引用了ConstClass中的常量,但是在編譯階段,hello world 已經(jīng)被存儲(chǔ)到NotInitialization類(lèi)的常量池中去了,所以這里HELLOWORLD常量的引用就指向NotIntialization類(lèi)的常量池了。
