是否需要编写默认构造函数?

时间:2017-02-24 23:35:59

标签: java inheritance constructor

我正在尝试为扩展超类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;
}

}

2 个答案:

答案 0 :(得分:0)

构造函数的第一行需要调用相应的超级构造函数。添加super(id, balance);之类的

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

将验证balance是否大于0,然后验证balance是否大于10。或者,将空构造函数添加到Account

Account() {
}

然后将使您的子类实例化(因为编译器会向super()插入一个空调用)。请注意,这是一个空构造函数,只有在未定义任何构造函数时才会添加默认构造函数。

答案 1 :(得分:0)

仅供参考,我们需要from the java docs from Oracle

  

注意:如果构造函数没有显式调用超类构造函数,Java编译器会自动插入对超类的无参数构造函数的调用。如果超类没有无参数构造函数,则会出现编译时错误。对象确实有这样的构造函数,因此如果Object是唯一的超类,则没有问题。