【问题标题】:Java - Is it possible to have a subclass constructor only 1 parameter, that doesn't involve calling super()?Java - 是否可以有一个子类构造函数只有 1 个参数,不涉及调用 super()?
【发布时间】:2017-04-18 11:08:07
【问题描述】:

这是我的抽象类:

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

任何帮助将不胜感激。

【问题讨论】:

    标签: java abstract-class super class-constructors


    【解决方案1】:

    如果父类没有默认(无参数)构造函数,则这意味着根据设计必须使用balance 值初始化该类。

    这意味着没有办法做你想做的事,除非用默认值初始化它(例如super(0))。

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

    【讨论】:

    • 如果我创建一个无参数构造函数,它不应该做点什么吗?如果我让它做一些无用的事情,比如将一个无意义的变量设置为 0,那会是糟糕的编程吗?
    • @Physco111:这完全是设计问题。在不指定初始余额(默认为 0)的情况下创建 BankAccount 是否有意义?如果答案是肯定的,那么您可以提供一个无参数构造函数,将其初始化为 0。
    • 好的,谢谢你,我想说你的回答对我来说最有意义。
    • 具体来说,错误是由于在所有其他构造函数中,非限定名称balance 由于阴影而引用局部变量,而在最后一个构造函数中没有这样的局部变量,并且因此该名称指的是超类的字段,此时不允许这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多