不多bb,先上結論:
1、一個類會被類加載去預加載,被加載的類,不一定被初始化。
2、類只有在首次被使用的時候,纔會被初始化,也就是類只會被初始化一次。
下面是六道題目,思考一下輸出結果應該是什麼?
Q1
結果是:
MyParent1 static block
hello world
分析:在這裏MyChild1和MyParent1都是被加載了,但是隻有MyParent1被初始化了。因爲沒有使用MyChild1,所以它不會被初始化。
Q2,對上邊Q1的修改
結果是:
MyParent1 static block
MyChild1 static block
welcome
分析:初始化子類的時候,一定會初始化其父類,這次是兩個類都被初始化了。
值得注意的是,只有類之間的繼承纔是這樣,接口間的繼承在子接口初始化的時候,不會對其父類接口進行初始化。
Q3
結果是:
hello world
分析:因爲str是被常量修飾的,在編譯階段常量str會被放到MyTest2的常量池中,跟MyParent2也就沒關係了。
不管是其他常量int,float等等常量,都是一樣的。
Q4,對上邊Q3的修改
結果是:
MyParent3 static code
uuid生成的id
分析:編譯期間常量不會被確定,自然不會放到常量池中,會導致MyParent3的初始化。
Q5
結果是:
MyParent4 static block
=====
分析:實例化對象的時候肯定會被初始化,而且只會初始化一次。
Q6,對Q5的修改
結果是:
沒有輸出
分析:數組類型是由JVM在運行期動態生成的,不會被初始化。
有任何問題歡迎留言評論,隨時回覆!