大家在去參加面試的時候,經常會遇到這樣的考題:給你兩個類的**,它們之間是繼承的關係,每個類裡只有構造器方法和一些變數,構造器裡可能還有一段** 對變數值進行了某種運算,另外還有一些將變數值輸出到控制台的**,然後讓我們判斷輸出的結果。這實際上是在考查我們對於繼承情況下類的初始化順序的了 解。
我們大家都知道,對於靜態變數、靜態初始化塊、變數、初始化塊、構造器,它們的初始化順序以此是靜態變數》靜態初始化 塊》變數》初始化塊》構造器。我們也可以通過下面的測試**來驗證這一點:
public class initialordertest
// 初始化塊
// 構造器
public initialordertest()
public static void main(string args)
}
執行以上**,我們會得到如下的輸出結果:
靜態變數
靜態初始化塊
變數
初始化塊
構造 器
這與上文中說的完全符合。那麼對於繼承情況下又會怎樣呢?我們仍然以一段測試**來獲取最終結果:
class parent
// 初始化塊
// 構造器
public parent()
}
public class subclass extends parent
// 初始化塊
// 構造器
public subclass()
// 程式入口
public static void main(string args)
}
執行一下上面的**,結果馬上呈現在我們的眼前:
父類--靜態變數
父類--靜態初始化塊
子類--靜態變數
子類--靜態初始化塊
父類--變數
父類--初始化塊
父類--構造器
子類--變數
子 類--初始化塊
子類--構造器
現在,結果已經不言自明了。大家可能會注意到一點,那就是,並不是父類完全初始化完畢後才 進行子類的初始化,實際上子類的靜態變數和靜態初始化塊的初始化是在父類的變數、初始化塊和構造器初始化之前就完成了。
了解了繼承情 況下類的初始化順序之後,如何判斷最終輸出結果就迎刃而解了。
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已經被初始化 所以列印出...