防止构造子类的未知错误

时间:2014-02-27 23:02:52

标签: java

这是我的超类:

public abstract class BankAccount
{
    private String name;
    private double balance;
    final int OVERDRAFT_FEE = 35;
    private static int accountNum=0;
    public BankAccount(String name)
    {
        this.name=name;
        balance=0;
        accountNum++;
    }

    //various methods omitted

    public abstract void endOfMonth();
    public String toString(BankAccount account)
    {
        return "Account Name: "+name+"\nBalance: $"+balance+"\nAccount Number: "+accountNum;
    }
}

这是我的子类:

public class CheckingAccount extends BankAccount
{
    final int TRANSACTION_LIMIT = 3;
    final int MINIMUM_BALANCE = 50;
    final int FEE = 10;
    private int transactionCount;

    // various methods omitted

    public void endOfMonth()
    {
        if(transactionCount>TRANSACTION_LIMIT)
        {
            int extra = transactionCount-TRANSACTION_LIMIT;
            int extra_fee = FEE*extra;
            super.setBalance((super.getBalance)-extra_fee);
        }
        if(super.getBalance()<MINIMUM_BALANCE)
        {
            super.setBalance((super.getBalance)-FEE);
        }
    }
}

在编译子类"constructor BankAccount in class BankAccount cannot be applied to given types; required: java.lang.String; found: no arguments; reason: actual and formal argument lists differ in length"

时,它给了我一个例外

我认为这首先是抽象方法的问题,但摆脱它并没有解决任何问题。想法?

4 个答案:

答案 0 :(得分:1)

因为不存在超类的默认构造函数,所以在BankAccount中添加一个默认调用的默认构造函数,或者为超类调用正确版本的构造函数

答案 1 :(得分:1)

您的父类构造函数声明为

public BankAccount(String name)

换句话说,它需要一个String参数。

通过不为您的CheckingAccount类明确提供构造函数,Java编译器会创建一个类似于

的构造函数。
public CheckingAccount() {
    super();
}

换句话说,它不会为您的父构造函数提供任何参数。

你需要改变它。声明具有适当参数的构造函数并将其传递给父级。

public CheckingAccount(String name) {
    super(name);
}

答案 2 :(得分:0)

在Java中,当您在抽象类中声明具有参数的构造函数时,所有子类都需要声明此构造函数。您可以将构造函数添加到CheckingAccount

class CheckingAccount extends BankAccount {
  public CheckingAccount(String name){
    super(name) //calling the BankAccount constructor.
  }
}

答案 3 :(得分:0)

默认情况下,您的子类将尝试调用其父类的默认构造函数,但您尚未提供它。有两种方法可以解决这个问题:

1)将默认构造函数添加到父类(public BankAccount()不带参数)

2)明确地从子类调用父构造函数:

public ChildAccount() {
    super("Checking Account");
}

(请参阅此处的类似示例:http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ308_002.htm