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

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

來來來,都坐下,先看看這段代碼,思考一下結(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è)字段的類才會(huì)被初始化,因此通過其子類來引用父類中定義的靜態(tài)字段,只會(huì)觸發(fā)父類的初始化,而不會(huì)初始化子類。
所以就能證明JVM加載類是懶加載模式,?我們?cè)賮砜纯雌渌那闆r。
public?class?NotInitialization?{
????public?static?void?main(String[]?args)?{
????????//?SuperClass?引用上面代碼的類
????????SuperClass[]?superClasses?=?new?SuperClass[10];
????}
}
上面這段代碼,創(chuàng)建了一個(gè)引用類型的數(shù)組,請(qǐng)問SuperClass會(huì)被初始化么?
“噢,這里都直接new了,肯定會(huì)被初始化呀~~”

答案是不會(huì)、不會(huì)、不會(huì)~~
再來看最后一段代碼,想想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é)果也沒有輸出“ConstClass init”,這是因?yàn)殡m然在Java代碼中引用了ConstClass中的常量,但是在編譯階段,hello world 已經(jīng)被存儲(chǔ)到NotInitialization類的常量池中去了,所以這里HELLOWORLD常量的引用就指向NotIntialization類的常量池了。
