2017-02-24 68 views
2

我想寫一個子類SavingsAccount的構造函數,它擴展了超類Account。帳戶已有一個構造函數,它具有兩個參數(idbalance)。 SavingsAccount的構造函數與Account的構造函數非常相似,不同的是我需要驗證balance,所以我不想使用super(String id, int balance)作爲構造函數。正在編寫一個默認的構造函數嗎?

當我嘗試創建一個新的構造函數時,我的IDE告訴我「'Account'中沒有默認構造函數可用」。我不明白爲什麼它告訴我當我在SavingsAccount中編寫一個新的構造函數時需要一個默認的構造函數。

我是否需要實際編寫一個默認構造函數?或者是我的當前構造函數中有一些不完全正確的東西?

超類:

public class Account extends Bank { 

String id; 
int balance; 

Account(String id, int balance){ 

    if(balance < 0) 
     throw new IllegalArgumentException("Balance cannot be less than 0.00"); 

    this.id = id; 
    this.balance = balance; 
} 

和子:

public class SavingsAccount extends Account { 

String id; 
int balance; 

SavingsAccount(String id, int balance){ 
    if(balance < 1000) 
     throw new IllegalArgumentException("Balance cannot be less than 10.00"); 

    this.id = id; 
    this.balance = balance; 
} 

}

+1

問題是,如果你沒有調用super,Java將會隱式地調用它而沒有參數。因爲你的超類沒有沒有參數的構造函數,所以它不會起作用... – Li357

+2

你的'SavingsAccount'類有_two different_'id'字段和_two different_'balance'字段。這幾乎肯定不是你想要的。 –

+2

如果您沒有提供構造函數,編譯器將爲您創建一個不帶參數的構造函數(並且不帶參數調用超類構造函數)。然而它不起作用,因爲你的超類已經包含一個非空的構造函數(所以編譯器不會爲你創建一個)。所以簡單地說,你需要創建一個適當的構造函數來調用適當的超類構造函數(正如Elliott的答案所示)。 – Jyr

回答

0

你的構造函數的第一行必須是適當的超級構造函數的調用。添加super(id, balance);

SavingsAccount(String id, int balance){ 
    super(id, balance); 

這將驗證balance0更大,然後再驗證balance10更大。另外,添加一個空的構造函數Account

Account() { 
} 

那麼這將使你的個子類的實例(因爲編譯器插入一個空的調用super())。請注意,這是一個空的構造函數,只有在您未定義任何構造函數時纔會添加默認構造函數。

+0

哦,我明白了。我沒有意識到超級構造函數是必要的。解決方案完美。謝謝。 – LMO

0

僅供參考,這被認爲是from the java docs from Oracle

注:如果構造函數沒有明確調用父類的構造函數,Java編譯器會自動插入到超類的無參構造函數的調用。如果超類沒有沒有參數的構造函數,那麼你會得到一個編譯時錯誤。對象確實有這樣的構造函數,所以如果Object是唯一的超類,那就沒有問題了。