2013-04-16 77 views
6

爲什麼Java不提供默認構造函數,如果類具有參數化構造函數? 考慮下面的例子爲什麼Java不提供默認構造函數,如果類具有參數化構造函數?

class A { 
    int a; 

    public A() { 
    } 

    public A(int val) { 
     a = val; 
    } 
} 

在這裏,我明確地需要添加默認的構造函數。是否有任何理由,爲什麼Java不提供具有參數化構造函數的類的默認構造函數?

+0

我不認爲這是重複的;它問*爲什麼*規範說明了它的作用。 – OrangeDog

+0

@OrangeDog這裏的難點在於OP的問題的文字回答是*「當你明確定義一個構造函數時,編譯器不會生成默認構造函數,因爲默認構造函數的定義是'編譯器在你沒有定義時定義的另一個'」*。 (他們的'public A(){}'不是默認的構造函數).OP可能混合了術語和*可能*實際上詢問無參數構造函數。如果我們假設OP在混合術語,那麼也許應該編輯這個問題。 – Radiodef

回答

2

如果你的類沒有定義任何的話,Java會給你一個默認的構造函數。

如果你有定義的任何構造函數(甚至沒有任何參數),編譯器將不會給你另一個構造函數。

它是這樣工作的,因爲它是這樣指定的。您可以在Language Specification

+4

OP知道'Java不提供默認構造函數,如果類有參數化構造函數'。問題是「爲什麼」? – Pshemo

9

中閱讀更多關於此的信息。原因與安全和接口的組合有關。編譯器不應該給你你沒有明確定義的方法。如果不指定任何構造函數,則一個例外是便利的無參數構造函數。如果你確實指定了一個構造函數,那麼編譯器會假設你不需要其他的。

5

因爲如果編譯器會自動爲每個類提供參數構造函數,它會破壞類設計。考慮掃描儀類。它有幾個構造函數,您可以從中指定要讀取數據的位置。如果編譯器也不添加arg構造函數,那麼在調用Scanner的方法之一來讀取用此構造函數初始化的對象中的數據之後,將拋出異常,因爲不會指定數據源。

2

有些情況下,不希望擁有默認構造函數。該語言必須提供一些方法來告訴編譯器不要生成它。使用除了存在顯式構造函數之外的某個指示符會導致問題,例如需要在禁用默認值時指定構造函數。

當前的安排通過確保每當默認被禁用時存在另一個構造函數來消除該問題。

相關問題