2012-04-18 220 views
0

我不確定我的頭腦中是否有正確的Java初始化機制模型。每類遵循以下幾點:靜態成員java初始化順序

  1. 初始化父類,如果存在一個
  2. 自己初始化

初始化遵循以下幾點:

  1. 初始化靜態和實例變量,有自己的價值觀設置在初始化程序之外。
  2. 運行靜態初始化塊
  3. 運行的構造塊

是不是準確/正確嗎?

+1

有一個在初始化對象和加載類的差。靜態成員在類加載時被初始化,而非靜態成員在創建對象時被初始化。 – scravy 2012-04-18 16:08:07

+0

要小心你說的「初始化」 – UmNyobe 2012-04-18 16:08:31

+0

可能是http://stackoverflow.com/questions/3499214/java-static-class-initialization的副本 – 2012-04-18 16:09:24

回答

1

代碼執行如下 -

靜態初始化塊運行一次,在第一次加載類時。

靜態變量

所有超級構造函數。

實例init塊在構造函數調用super()後運行。

實例變量。

(初始化程序塊執行在它們出現的順序。)

+1

不能保證靜態init塊會在靜態變量之前運行。事實上,許多靜態變量(那些是final的並且具有編譯時間常量表達式的)在靜態初始化塊之前分配。 – henko 2012-04-18 19:08:38

1

根據Java language specification,你的假設或多或少是正確的。例外情況是:當構造類(與構造函數一起)類初始化後

  1. 實例變量的運行,
  2. 最終靜態編譯時常量表達式的變量,甚至嘗試之前加載加載超類,並且將靜態初始化塊與靜態變量一起作爲一個塊按它們在代碼中出現的順序運行。
+0

我只是想寫下來,我期望第1段 – 2012-04-18 16:16:08

+0

我會我也期望這一點,我剛纔注意到,這個問題陳述了靜態和實例變量在課堂建設之前一起初始化的假設。 – henko 2012-04-18 16:18:21