【问题标题】:can I call subclasses on an array of a superclass?我可以在超类的数组上调用子类吗?
【发布时间】:2013-11-06 00:38:37
【问题描述】:

如果我有一个包含子类的对象数组,我可以通过调用数组来访问子类中的方法吗?

这是我的 Banking 类中的一个方法,我想设置检查:

public void deposit() throws IOException {
BufferedReader br;
String entered_amount;

System.out.print("How much would you like to deposit? :");
br = new BufferedReader(new InputStreamReader(System.in));
entered_amount = br.readLine();
double amount = Double.valueOf(entered_amount).doubleValue();
balance = balance + amount;

System.out.println("Your balance is: " + getBalance());

这是我的 Checking 课程:

public class Checking extends Bankaccount {

private double balance;

public Checking() {
}

public Checking(double balance) {
    this.balance = balance;
}

/**
 * @return the balance
 */
public double getBalance() {
    return balance;
}

/**
 * @param balance the balance to set
 */
public void setBalance(double balance) {
    this.balance = balance;
}

}

在我的主类中调用baArray[0] 时,有没有办法让存款设置支票类中的余额值?

我这样做的原因是因为我将对象数组写入文件并在程序启动时重新读取它们。我需要能够存储 3 套支票和储蓄。我的存款方式将是我尝试编辑的方式,以使用继承来设置支票余额。

【问题讨论】:

  • 只要超类声明一个公共的deposit方法,就没有问题。该方法可能是抽象的。
  • 正是 afk5min 所说的。您需要让超类有一个无主体方法deposit,子类为其提供适当的逻辑。

标签: java arrays inheritance polymorphism


【解决方案1】:

添加到您的Banking 班级:

public abstract setBalance(double balance);

如果除了Checking 类之外,您还有subclassesBankingsetBalance 方法没有意义,那么您可以实现该方法并简单地让它抛出异常。 (不过,Savings 类也有一个 setBalance 方法似乎是有意义的。)

或者,您可以将CheckingsetBalance 方法移到超类Banking,然后CheckingSavings 都将继承setBalance 方法。如果你需要覆盖它们,你可以,没问题。

编辑:根据这个答案的 cmets,我现在更清楚你想要完成什么。

如果您打算拥有一个Banking 对象数组,并且每个对象都有一些唯一的帐号,并且对于每个Bank 帐户,都有一个Checking 帐户和一个Savings 帐户,那么从逻辑上讲,听起来CheckingSavings 成为只能通过Banking 类访问的private 类更有意义。

因此,当帐户持有人去银行时,他们会开设一个Banking 帐户。也许默认情况下,它带有 1 个Checking 帐户和 1 个Savings 帐户。这些将是您的 Banking 类中的类变量:

private Checking checking;
private Savings savings;

现在您的 Banking 类需要公共方法来访问支票和储蓄账户。

假设您的CheckingSavings 类都有getBalancesetBalance。现在您的 Banking 类需要为每种类型的帐户提供一个 settergetter,它只调用适当的方法。

例如,在您的Banking 类中:

public void setCheckingBalance(double balance)
{
    checking.setBalance(balance);
}

public double getCheckingBalance()
{
    return checking.getBalance();
}

然后在您的主要方法中,您将通过以下方式使用这些方法:

baArr[0].setCheckingBalance(100.00);

【讨论】:

  • 你能解释一下什么是public abstract setBalance(double balance);做?以及如何使用它?这是要设置支票余额吗?我相信那是一个界面?我不知道我对他们不熟悉。
  • abstract 仅仅意味着该方法实际上并不存在于它所编写的类中(如果实例化Banking 对象,则不能在Banking 类的任何对象上调用它)。但是,Banking 的任何子类都必须实现 setBalance 方法。因此,当您在 Banking 对象的数组上调用它时,它知道它们都将具有此方法,并且它将查找正确的类以使该方法以多态方式调用。
  • 我可以做一个抽象的集合和平衡吗?
  • 是的。您可以使用任何方法创建abstract。你甚至可以将Banking 设为abstract class,如果这对你想做的事情有意义的话。
  • 我很困惑,所以如果我把它放进去,如果我调用 baArray[0].setBalance(double) 它会传递给检查方法吗?如果我有检查和储蓄方法怎么办它如何区分检查和储蓄的两个 setBalance() 方法@nhgrif
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
  • 2010-10-11
  • 1970-01-01
  • 2010-10-28
相关资源
最近更新 更多