面試官:如何用一段代碼證明JVM加載類是懶加載模式
來源:jiannan.blog.csdn.net
假如有一天,你要找工作,等到了面試邀請,來到了面試公司,做完了筆試題,迎來了面試官。
面試官的第一個問題確是:你如何用一段代碼證明在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);
}
}
上述代碼,只會輸出:
SuperClass init
10
而不會輸出SubClass init,對于靜態(tài)字段,只有直接定義這個字段的類才會被初始化,因此通過其子類來引用父類中定義的靜態(tài)字段,只會觸發(fā)父類的初始化,而不會初始化子類。
所以就能證明JVM加載類是懶加載模式, 我們再來看看其他的情況。
public class NotInitialization {
public static void main(String[] args) {
// SuperClass 引用上面代碼的類
SuperClass[] superClasses = new SuperClass[10];
}
}
上面這段代碼,創(chuàng)建了一個引用類型的數(shù)組,請問SuperClass會被初始化么?
“噢,這里都直接new了,肯定會被初始化呀~~”

答案是不會、不會、不會~~
再來看最后一段代碼,想想ConstClass中的stataic靜態(tài)代碼塊會被執(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);
}
}
運行結(jié)果也沒有輸出“ConstClass init”,這是因為雖然在Java代碼中引用了ConstClass中的常量,但是在編譯階段,hello world 已經(jīng)被存儲到NotInitialization類的常量池中去了,所以這里HELLOWORLD常量的引用就指向NotIntialization類的常量池了。
· END ·
熱門推薦:
PS:如果覺得我的分享不錯,歡迎大家隨手點贊、轉(zhuǎn)發(fā)、在看。
評論
圖片
表情

