JAVA面試題解惑系列(一) 類的初始化順序

2021-05-25 07:06:45 字數 1087 閱讀 8921

大家在去參加面試的時候,經常會遇到這樣的考題:給你兩個類的**,它們之間是繼承的關係,每個類裡只有構造器方法和一些變數,構造器裡可能還有一段**對變數值進行了某種運算,另外還有一些將變數值輸出到控制台的**,然後讓我們判斷輸出的結果。這實際上是在考查我們對於繼承情況下類的初始化順序的了解。

我們大家都知道,對於靜態變數、靜態初始化塊、變數、初始化塊、構造器,它們的初始化順序以此是(靜態變數、靜態初始化塊)>(變數、初始化塊)>構造器。我們也可以通過下面的測試**來驗證這一點:

執行以上**,我們會得到如下的輸出結果:

靜態變數

靜態初始化塊

變數 初始化塊

構造器

這與上文中說的完全符合。那麼對於繼承情況下又會怎樣呢?我們仍然以一段測試**來獲取最終結果:

執行一下上面的**,結果馬上呈現在我們的眼前:

父類--靜態變數

父類--靜態初始化塊

子類--靜態變數

子類--靜態初始化塊

父類--變數

父類--初始化塊

父類--構造器

子類--變數

子類--初始化塊

子類--構造器

現在,結果已經不言自明了。大家可能會注意到一點,那就是,並不是父類完全初始化完畢後才進行子類的初始化,實際上子類的靜態變數和靜態初始化塊的初始化是在父類的變數、初始化塊和構造器初始化之前就完成了。

那麼對於靜態變數和靜態初始化塊之間、變數和初始化塊之間的先後順序又是怎樣呢?是否靜態變數總是先於靜態初始化塊,變數總是先於初始化塊就被初始化了呢?實際上這取決於它們在類中出現的先後順序。我們以靜態變數和靜態初始化塊為例來進行說明。

同樣,我們還是寫乙個類來進行測試:

執行上面的**,會得到如下的結果:

test--a

靜態初始化塊

test--b

大家可以隨意改變變數a、變數b以及靜態初始化塊的前後位置,就會發現輸出結果隨著它們在類中出現的前後順序而改變,這就說明靜態變數和靜態初始化塊是依照他們在類中的定義順序進行初始化的。同樣,變數和初始化塊也遵循這個規律。

了解了繼承情況下類的初始化順序之後,如何判斷最終輸出結果就迎刃而解了。

JAVA面試題解惑系列(一) 類的初始化順序

大家在去參加面試的時候,經常會遇到這樣的考題 給你兩個類的 它們之間是繼承的關係,每個類裡只有構造器方法和一些變數,構造器裡可能還有一段 對變數值進行了某種運算,另外還有一些將變數值輸出到控制台的 然後讓我們判斷輸出的結果。這實際上是在考查我們對於繼承情況下類的初始化順序的了 解。我們大家都知道,對...

Java中的面試題 繼承與類載入

有a,b,main三個類如下 public class a public class b extends a public class main extends b private a a new a private b b new b public static void main string ...

Java 類的載入過程(阿里面試題)

載入方法不等於執行方法,初始化變數則會賦值 類載入順序應為 載入靜態方法 初始化靜態變數 執行靜態 塊 例項化時 先載入非靜態方法 例項化非靜態變數 執行構造 塊 執行建構函式 author panteng public class statictest 第六個載入 此時,n已經被初始化 所以列印出...