2014-02-20 55 views
3

在Java中,但在其他面向對象的語言,以及,是否有初始化在其定義的屬性之間的差異,如初始化在定義與初始化在構造函數中

class Example { 
    public Sample sample_attribute = new Sample(); 
} 

,並使用一個構造函數來初始化它?

class Example { 
    public Sample sample_attribute; 

    public Example() { 
     sample_attribute = new Sample(); 
    } 
} 

我想不出任何實際的區別,有沒有一個?否則,即使它們有相同的結果,是否有一種方法比另一種更好?

+1

@Ɍ.Ɉ:我不同意。我的問題更爲具體(不同於其他問題,實際上它是作爲身體問題提出的)。 – Numbers

回答

3

初始化順序在這裏很重要。

  1. 設置字段默認初始值(0,假,空)
  2. 調用構造函數對象(但不執行的 構造體還)
  3. 調用的構造函數使用初始值設定和初始化塊超
  4. 初始化字段
  5. 執行構造的主體

因此,第一種情況將在第四步中初始化變量sample_attribute,第二種情況將在第五步中初始化變量sample_attribute。這完全取決於你的要求。

如果要訪問構造函數中的任何變量,則需要使用第一種情況。

+1

如果查看生成的字節碼,構造函數將調用超類的構造函數,執行初始化,然後執行構造函數中實際編碼的內容。所以沒有技術上的區別,除了在構造函數的任何語句之前執行「初始化」之外。 –

+0

@HotLicks:是的,這就是我所說的'取決於OP的要求' –

0

當您使用傳遞給構造函數的信息初始化字段時,除了在構造函數中進行初始化之外,別無選擇。否則,我更喜歡現場初始化,因爲它可以節省我後面要閱讀的代碼行。

0

這兩個版本是等效的。但是,如果new Sample()拋出一個檢查異常,您將無法在現場聲明中初始化它