スーパークラスAccount
を継承するサブクラスSavingsAccount
のコンストラクタを記述しようとしています。アカウントには既に2つのパラメータ(id
とbalance
)を受け取るコンストラクタがあります。 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;
}
}
スーパーを呼び出さないと、パラメータなしで暗黙的に呼び出されるという問題があります。あなたのスーパークラスはパラメータを持たないコンストラクタを持っていないので、動作しません... – Li357
あなたの 'SavingsAccount'クラスは、異なった' id'フィールドと_two異なる 'balance'フィールドを持っています。これはほとんどあなたが望むものではありません。 –
コンストラクタを指定しないと、コンパイラは引数なしでスーパークラスコンストラクタを呼び出します。しかし、あなたのスーパークラスにはすでに空でないコンストラクタが含まれているので(コンパイラはあなたのためにそれを作っていないので)、うまくいきません。簡単に言えば、適切なスーパークラスコンストラクタを呼び出す適切なコンストラクタを作成する必要があります(Elliottの答えが示すように)。 – Jyr