Java - 是否有可能只有一个子类构造函数有一个参数,它不涉及调用super()?

时间:2016-12-03 18:02:20

标签: java abstract-class super class-constructors

这是我的抽象类:

public abstract class BankAccount{
  protected long balance;

  public BankAccount(long balance){ \\<--Abstract class constructor
    this.balance = balance;
  }

  ... more stuff
}

我有以下子类(也是一个额外的子类SavingsAccount,它们都有自己的独立余额,但是它们是无关的):

public class CurrentAccount extends BankAccount{
  private int PIN;
  private long overdraft = 0;
  private long balance;

  // Set balance and overdraft and the PIN
  public CurrentAccount(long balance, long overdraft, int PIN){
    super(balance);
    this.overdraft = overdraft;
    setPIN(PIN);
  }


  // Set balance and overdraft
  public CurrentAccount(long balance, long overdraft){
    super(balance);
    this.overdraft = overdraft;
  }

  // Set overdraft only
  public CurrentAccount(long overdraft){  \\<-- is it possible to have something like this?
    super(balance);
    this.overdraft = overdraft;
  }

  public void setPIN(int PIN){
    if(PIN >= 0000 && PIN <= 9999){ 
      this.PIN = PIN;
    }
  }

  ... more methods
}

正如你从上面所看到的,我想要一个只设置透支的构造函数,但我仍然需要在每个构造函数的开头调用super,所以我只是传入,无论当前的平衡如何,我能做到吗?或者我在CurrentAccount子类中是否需要平衡变量?

编译java时给我这个:

CurrentAccount.java:41: error: cannot reference balance before supertype constructor has been called
    super(balance);
          ^
1 error

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

如果父类没有默认(无参数)构造函数,那么这意味着 按设计 该类必须使用balance值进行初始化

这意味着除非用默认值(例如super(0))初始化,否则无法做你想要做的事情。

错误是由于您在实际构建超类之前访问超类的字段,这是您必须在子类中执行的第一件事。

答案 1 :(得分:-3)

在您的对象未构建之前,不会设置变量的默认值,因此如果您希望在构造时设置其默认值,则使它们静态或明确设置他们之前。