第十四题: 以下代码的输出结果是?
第十四題:
以下代碼的輸出結果是?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public class B { ??? public static B t1 = new B(); ??? public static B t2 = new B(); ??? { ??? ? ? System.out.println("構造塊"); ??? } ??? static ??? { ??? ? ? System.out.println("靜態塊"); ??? } ??? public static void main(String[] args) ??? { ??? ? ? B t = new B(); ??? } } |
?
A 靜態塊 構造塊 構造塊 構造塊 B 構造塊 靜態塊 構造塊 構造塊 C 構造塊 構造塊 靜態塊 構造塊 D:構造塊 構造塊 構造塊 靜態塊懵逼樹上懵逼果,懵逼樹下你和我
首先看到這道題,我就想著那不是先靜態代碼塊先執行嗎
話不多說,直接跑代碼
public class B{public static B t1 = new B();public static B t2 = new B();{System.out.println("構造塊");}static{System.out.println("靜態塊");}public static void main(String[] args){B t = new B();}}運行結果
接著我們看看大家的評論
開始時JVM加載B.class,對所有的靜態成員進行聲明,t1 t2被初始化為默認值,為null,又因為t1 t2需要被顯式初始化,所以對t1進行顯式初始化,初始化代碼塊→構造函數(沒有就是調用默認的構造函數),咦!靜態代碼塊咋不初始化?因為在開始時已經對static部分進行了初始化,雖然只對static變量進行了初始化,但在初始化t1時也不會再執行static塊了,因為JVM認為這是第二次加載類B了,所以static會在t1初始化時被忽略掉,所以直接初始化非static部分,也就是構造塊部分(輸出''構造塊'')接著構造函數(無輸出)。接著對t2進行初始化過程同t1相同(輸出'構造塊'),此時就對所有的static變量都完成了初始化,接著就執行static塊部分(輸出'靜態塊'),接著執行,main方法,同樣也,new了對象,調用構造函數輸出('構造塊')
最后答案選擇C
文章僅個人理解,來在各大網站。如有不合理之處,歡迎吐槽。
閱讀目錄(置頂)(長期更新計算機領域知識)
閱讀目錄(置頂)(長期更新計算機領域知識)
閱讀目錄(置頂)(長期科技領域知識)
歌謠帶你看java面試題
總結
以上是生活随笔為你收集整理的第十四题: 以下代码的输出结果是?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: native2ascii命令详解
- 下一篇: 【高并发高性能高可用之海量数据MySQL