2012-08-07 64 views
3

很簡單的問題,但無論如何:沒有任何理由來覆蓋默認的構造函數是這樣的:重寫默認的構造函數

public SomeObject(){ 
} 

這是公開的。它沒有任何邏輯。那麼,有必要嗎?我沒有看到全貌?

感謝您的幫助。

+0

並非如此,但如果您在實例化對象時需要添加一些代碼,它將允許在將來保存幾秒鐘。然而'私人SomeObject(){}'確實讓多一點感覺:) - 也是在C++中是很常見的禮遇':: SomeObject(){}'和'::〜SomeObject(){}'即使包括他們沒有使用。 – 2012-08-07 16:13:13

回答

9

一個原因來定義無參數的構造函數,如果有一個非默認的構造函數和無參數的構造函數仍然希望被訪問(公共或保護)。

這是因爲默認無參數構造的任何[其他]構造的定義will prevent the automatic addition

編譯器自動提供了[公共]無參數,對於沒有任何構造類默認的構造。

(請參閱該鏈接下位爲好,它談到了默認的超級構造函數將被調用。)

即使無參數的構造函數是永遠不會用手動,也可以是對其他事物很重要,例如Serializable

在反序列化,非序列化類的字段將使用公共初始化或保護之類的無參數的構造函數。 無序參數構造函數必須可以訪問序列化的子類。可序列化子類的字段將從流中恢復。

+1

這是正確的答案。另一方面,如果你在Android中開發,並且你沒有在具有非默認構造函數的Fragment中提供無參數構造函數,那麼當你從睡眠中喚醒你的應用程序時會發生崩潰,因爲系統使用no-arg構造函數來實例化你的Fragment。 – 2012-08-07 21:58:35

+0

謝謝。簡單而全面的答案。 – 2012-08-08 07:27:39

1

除非您有任何初始化邏輯,否則不需要重寫默認構造函數。

4

唯一的原因可能是,有時你可能有帶參數的構造函數,並且你想允許在不傳遞參數的情況下創建對象(通過調用默認構造函數)。

如果您定義了構造函數,則不會有arg構造函數可用,因此您必須將它明確地添加到您的類中。

1

的確切原因是,如果你不這樣做,你會同時擴展類

class A{ 
    int a; 
    public A(int a){ 
     this.a=a; 
    } 
    // public A() 
    //{ 
     // here super(); will be called again, calling Object class's constructor thus initializing any uninitialized variables 
    //} 
} 

class B extends A{ 
    int b; 
    public B(int b){ 
     // here automatically, "super();" will be executed. if it is not present, error! 
     this.b=b; 
    } 
} 

有問題,經過thisthis明白我想說什麼。

編輯:一些問題的答案實際上是錯誤的,因爲你可以看到,定義父而擴展類,除非你明確地調用重載超構造與ARGS無參數的構造函數是強制性的。

+0

它不需要**如果**隱式調用重載構造函數。所以,你不能說它不是_not_,就像它根本不是! O_O – Prasanth 2012-08-07 17:24:45