2017-02-24 6 views
2

スーパークラスAccountを継承するサブクラスSavingsAccountのコンストラクタを記述しようとしています。アカウントには既に2つのパラメータ(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

スーパーを呼び出さないと、パラメータなしで暗黙的に呼び出されるという問題があります。あなたのスーパークラスはパラメータを持たないコンストラクタを持っていないので、動作しません... – Li357

+2

あなたの 'SavingsAccount'クラスは、異なった' id'フィールドと_two異なる 'balance'フィールドを持っています。これはほとんどあなたが望むものではありません。 –

+2

コンストラクタを指定しないと、コンパイラは引数なしでスーパークラスコンストラクタを呼び出します。しかし、あなたのスーパークラスにはすでに空でないコンストラクタが含まれているので(コンパイラはあなたのためにそれを作っていないので)、うまくいきません。簡単に言えば、適切なスーパークラスコンストラクタを呼び出す適切なコンストラクタを作成する必要があります(Elliottの答えが示すように)。 – Jyr

答えて

0

最初の行には、適切なスーパーコンストラクタの呼び出しにする必要があります。 super(id, balance);balance0以上であることを検証し、その後balance10より大きい検証なる

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

のようにを追加します。また、(コンパイラは super()に空の呼び出しを挿入するため)、次にインスタンス化するサブクラスを可能になる Account

Account() { 
} 

に空のコンストラクタを追加します。これは空のコンストラクタであることに注意してください。デフォルトのコンストラクタはコンストラクタを定義しない場合にのみ追加されます。

+0

ああ、そうだ。スーパーコンストラクターが必要であることは分かりませんでした。ソリューションは完全に機能します。ありがとうございました。 – LMO

0

ただ、参考のために、これはfrom the java docs from Oracle

注取られる:コンストラクタは明示的にスーパークラスのコンストラクタを呼び出していない場合はを、Javaコンパイラが自動的にスーパークラスの引数なしのコンストラクタへの呼び出しを挿入します。スーパークラスに引数のないコンストラクタがない場合は、コンパイル時エラーが発生します。 Objectにはこのようなコンストラクタがあるため、Objectが唯一のスーパークラスであれば問題ありません。

関連する問題