"cannot find symbol: method" 但是该方法已被声明

11
在我的驱动程序中,这一行代码给我一个"cannot find symbol"的错误,我不知道为什么。这个方法在"SavingsAccount"类中被明确定义了,我可以在我的驱动程序中引用所有其他的方法,但就是不能用那个方法,我尝试将类型改成"double"等,但还是不起作用。
Account acct2 = new SavingsAccount (name);
acct2.calculateBalance();

SavingsAccount 类继承自 Account 类:

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;
    }


}

如有需要,可以使用Account类

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);

}

方法calculateBalance()仅属于SavingsAccount类,即您没有覆盖它。要使用您的代码,父类Account应该声明或实现它。 - Siddappa Walake
3个回答

11
Account acct2 = new SavingsAccount (name);
acct2.calculateBalance();
这是因为虽然您有一个 SavingsAccount 对象,但您正在使用类型为 Account 的引用变量,因此您只能访问 Account 类中存在的那些方法。

而您的Account类中没有calculateBalance()方法。

这就是为什么您无法访问它,并且编译器报错说找不到名为calculateBalance的方法,因为它看到引用类型为Account,而在Account类中没有这样的方法。

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

SavingsAccount acct2 = new SavingsAccount (name);

或者在访问该方法时明确地将其强制转换

((SavingsAccount) acct2).calculateBalance();

但要注意,如果acct2对象实际上不是SavingsAccount对象,则可能会抛出ClassCastException异常。

更新:

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


我原以为多态引用可以给我这种能力。 - Aaron
因为您在Account类中定义了withdraw方法,尽管它是抽象的。 - Abubakkar
我想我没有完全理解这个概念。 - Aaron
@Aaron,请查看我的更新,你应该清楚关于多态性的概念。 - Abubakkar

1

尝试切换,

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

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

或者(不确定为什么你要这么做),我认为你可以将acct2转换为SavingsAccount


0
“所有其他方法”都来自于Account,而不是SavingsAccount。当您想要调用cCalculateBalance时,请尝试像这样:

(SavingsAccount)acct2.calculateBalance()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接