这是我的超类:
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"
我认为这首先是抽象方法的问题,但摆脱它并没有解决任何问题。想法?
答案 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)