java 面试题解惑一 类的初始化顺序
大家在去參加面試的時候,經(jīng)常會遇到這樣的考題:給你兩個類的代碼,它們之間是繼承的關系,每個類里只有構造器方法和一些變量,構造器里可能還有一段代碼對變量值進行了某種運算,另外還有一些將變量值輸出到控制臺的代碼,然后讓我們判斷輸出的結果。這實際上是在考查我們對于繼承情況下類的初始化順序的了解。?
我們大家都知道,對于靜態(tài)變量、靜態(tài)初始化塊、變量、初始化塊、構造器,它們的初始化順序依次是(靜態(tài)變量、靜態(tài)初始化塊)>(變量、初始化塊)>構造器。我們也可以通過下面的測試代碼來驗證這一點:?
運行以上代碼,我們會得到如下的輸出結果:?
這與上文中說的完全符合。那么對于繼承情況下又會怎樣呢?我們仍然以一段測試代碼來獲取最終結果:?
運行一下上面的代碼,結果馬上呈現(xiàn)在我們的眼前:?
現(xiàn)在,結果已經(jīng)不言自明了。大家可能會注意到一點,那就是,并不是父類完全初始化完畢后才進行子類的初始化,實際上子類的靜態(tài)變量和靜態(tài)初始化塊的初始化是在父類的變量、初始化塊和構造器初始化之前就完成了。?
那么對于靜態(tài)變量和靜態(tài)初始化塊之間、變量和初始化塊之間的先后順序又是怎樣呢?是否靜態(tài)變量總是先于靜態(tài)初始化塊,變量總是先于初始化塊就被初始化了呢?實際上這取決于它們在類中出現(xiàn)的先后順序。我們以靜態(tài)變量和靜態(tài)初始化塊為例來進行說明。?
同樣,我們還是寫一個類來進行測試:?
運行上面的代碼,會得到如下的結果:?
大家可以隨意改變變量a、變量b以及靜態(tài)初始化塊的前后位置,就會發(fā)現(xiàn)輸出結果隨著它們在類中出現(xiàn)的前后順序而改變,這就說明靜態(tài)變量和靜態(tài)初始化塊是依照他們在類中的定義順序進行初始化的。同樣,變量和初始化塊也遵循這個規(guī)律。?
轉載于:https://www.cnblogs.com/leetcode/p/3199779.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結
以上是生活随笔為你收集整理的java 面试题解惑一 类的初始化顺序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: codeblocks下libcurl的配
- 下一篇: 节点树xmu 1466.祖先极值