在我的驱动程序中,这一行给了我cannot find symbol错误,我不知道为什么。SavingsAccount类,我可以引用我的驱动程序中的所有其他方法,但不是那个方法,我尝试将类型更改为double等但仍然无法正常工作。

Account acct2 = new SavingsAccount (name);
acct2.calculateBalance();

SavingsAccount类继承自AccountClass:

public class SavingsAccount extends Account
{
    private final short minBalance = 0;
    private double overdraftFee;
    private double yearlyInterestRate = 0.02;
    private double interestAmount;

    public SavingsAccount (String name)
    {
        super(name);
    }

    public double withdraw (double amount)
    {
        if (accountBalance - amount >= minBalance)
        {
            accountBalance -= amount;
            System.out.print ("Withdraw Successful");
        }
        else 
        {
            accountBalance -= amount;
            overdraftFee = accountBalance * (0.10);
            accountBalance += overdraftFee;
            System.out.print ("Withdraw Succesful, however overdraft fee of 10% has been applied to your account");


        }

        return accountBalance;
    }

// ----------------- this is the method I try to invoke -----------------------------
    public void calculateBalance ()
    {
        interestAmount = (accountBalance * yearlyInterestRate);
        accountBalance += interestAmount;
    }
// ----------------------------------------------------------------------------------

    public String toString()
    {
        return super.toString() + " Interest Received: " + interestAmount;
    }


}

帐户类别(如果需要)

import java.util.Random;
import java.text.NumberFormat;

public abstract class Account
{
    protected double accountBalance;
    protected long accountNumber;
    protected String accountHolder;
    public Account (String name)
    {
        accountHolder = name;
        accountBalance = 0;
        Random accountNo = new Random();
        accountNumber  = accountNo.nextInt(100000);
    }

    public double deposit (double amount)
    {
        accountBalance += amount;

        return accountBalance;
    }

    public String toString()
    {
        NumberFormat accountBal = NumberFormat.getCurrencyInstance();
        return "Account Balance: " + accountBal.format(accountBalance) + "\nAccount Number: " + accountNumber;
    }

    public String getAccountHolder()
    {
        return accountHolder;
    }

    public double getAccountBalance()
    {
        return accountBalance;
    }

    public abstract double withdraw (double amount);

}

答案

Account acct2 = new SavingsAccount (name);
acct2.calculateBalance();

这是因为虽然你有一个对象SavingsAccount您正在使用类型的引用变量Account所以你只能访问其中的那些方法Account班级。

而你没有calculateBalance()方法在你的Account班级。

这就是为什么您无法访问它并且编译器抱怨它找不到名为的方法calculateBalance因为它看到引用类型是Account并且里面没有这样的方法Account班级。

如果您想使用该方法,请将引用类型更改为SavingsAccount:

SavingsAccount acct2 = new SavingsAccount (name);

或者您可以在访问该方法时显式转换它

((SavingsAccount) acct2).calculateBalance();

但要注意它可能会抛出ClassCastException如果acct2对象实际上不是对象SavingsAccount

UPDATE:

但请记住,在运行时,Java 使用虚拟方法调用根据实际实例动态选择将运行的方法的实际版本。

来自: stackoverflow.com