为什么找不到我的子类方法(符号)?

时间:2014-01-25 21:05:11

标签: java inheritance

我是Java的新手,正在研究一个显示继承的简单程序。我在访问派生类中的方法时遇到问题,因为我的变量定义似乎不使用子类名称,而是使用超类名称(Accounts)。为什么当我调用存款方法时,找不到符号错误?

import java.util.*;
import java.text.*;


public class Accounter {

static Scanner input = new Scanner(System.in);
static Accounts myAccount;

public static void main(String[] args) {

    int result; //holder for user input
    double amount; //holder for desposits and withdrawals

    System.out.println("What kind of account would you like to setup?");
    System.out.println("Checking[1] or Savings[2]");
    result = input.nextInt();

    if(result == 1) {
        myAccount = new Checking();
    } else {
        myAccount = new Savings();
    }

    myAccount.deposit(199.99);



}

}

class Accounts {
double balance;
public String accountName;
public Date dateOpened;
public Date today = new Date();

public Accounts() {
    dateOpened = today;
}
public Date getDateOpened() {
    return dateOpened;
}
public double getBalance() {
    return balance;
}
}

class Checking extends Accounts {
public void deposit(double amount) {
    this.balance = this.balance + amount;
}
 }
 class Savings extends Accounts {
public void deposit(double amount) {
    this.balance = this.balance + amount;
}
 }

3 个答案:

答案 0 :(得分:3)

  1. class Accounts声明为abstract

  2. 在此课程中将double balance声明为protected字段。

  3. 在此课程中将public void deposit(double amount)声明为abstract方法。

答案 1 :(得分:1)

存款未在您的基类中定义,您应该做的是,

在基类中定义此方法并在子类中覆盖它。

public class Accounts{
  public void deposit(double amount) {
  }
}

class Checking extends Accounts {

  @Override
  public void deposit(double amount) {
    this.balance = this.balance + amount;
  }
}

答案 2 :(得分:0)

myAccountAccounts的一个实例,它是您的基类。

您无法直接从对基类的引用中访问派生类中的方法。

要调用该方法,您需要转换为所需的派生类:

if(result == 1) {
    myAccount = new Checking();
} else {
    myAccount = new Savings();
}
if(myAccount instanceof Checking)
    (Checking)myAccount.deposit(199.99);
else if(myAccount instanceof Savings)
    (Savings)myAccount.deposit(199.99);

... 但是 ......

由于派生类共享相同的方法,因此最好在基类Accounts类中定义该方法,如下所示:

class Accounts {
    ...
    public void deposit(double amount) {
        this.balance = this.balance + amount;
    }
}

然后像原来那样打电话给你的方法。这样您就不必检查myAccount是否是一个派生类或另一个派生类的实例。如果您需要在将来的派生类中更改该方法的行为,则可以覆盖它。