關於類加載順序的六道題,你都會嗎?

不多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在運行期動態生成的,不會被初始化。

 

有任何問題歡迎留言評論,隨時回覆!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章