0

我是一名初级程序员,试图学习 Java 的基础知识。基本上,银行类中的方法 printBankSummary() 和 accrueInterestAllAccounts() 给了我这个问题。以下是代码:

public class Bank {

  private String name;
  private SavingsAccount [] accounts;
  private int totalAccounts;
  public static final int MAX_ACCOUNTS  = 20;

  public Bank(String name) {
    this.name = name;
    totalAccounts = 0;
    accounts = new SavingsAccount[MAX_ACCOUNTS];
}

  public void printBankSummary() {
   System.out.println("Bank name: " + getName());
   BankAccount.printAccountInfo(); //non-static method cannot be referenced from a static context error
  }

  public void accrueInterestAllAccounts() {
    SavingsAccount.accrueInterest(); //non-static method cannot be referenced from a static context error
  }

  public static void main (String args[]) {
    Bank x = new BankAccount("Java S&L");

    x.printBankSummary();
    x.accrueInterestAllAccounts();
  }
4

3 回答 3

1

这些方法是实例方法——它们对您的类的一个实例SavingsAccount进行操作。

当您调用时SavingsAccount.printAccountInfo(),您是在告诉 JavaprintAccountInfo()作为静态方法调用。您基本上是在告诉 Java:“您可以在类 SavingsAccount 中找到此方法,并且您不需要 SavingsAccount 的实例即可使用它。”。

您可能想要做的是找到要打印其帐户信息的类的实例。SavingsAccount假设这个实例在 variable 中x,那么你会调用x.printAccountInfo().
同样的事情发生在你调用accrueInterest.

于 2012-10-12T22:14:35.827 回答
0
 BankAccount.printAccountInfo();

是静态方法(从类访问),因此除非调用它的方法也是静态的,否则无法访问。代替

 public void printBankSummary() {
       System.out.println("Bank name: " + getName());
       BankAccount.printAccountInfo();
      }

关于什么

    public void printBankSummary() {
       System.out.println("Bank name: " + getName());
//calls printAccountInfo on the instance that called printBankSummary()
       printAccountInfo();
      }

而对于

public void accrueInterestAllAccounts() {
    SavingsAccount.accrueInterest();
  }

你不能调用Class.Method,你想做的是

    public void accrueInterestAllAccounts() {
for(Account acc: Accountarr) {            
            acc.accrueInterest();
          }
}
于 2012-10-12T22:14:48.003 回答
0

简单的答案:由于 Java 中静态类型的性质,任何引用静态方法/变量的方法也必须是静态的。

解决此问题的方法是将您的类和测试程序分开,这样您的类的源文件中就没有 'public static void main(String args[]) 方法。然后,您可以将导致您遇到问题的两个方法放在测试类中,并将它们的方法声明修改为静态。

如果您确实希望您的两个有问题的方法是实例方法,那么您将需要为您的类创建一个新实例并以这种方式调用它们。

于 2012-10-12T22:15:05.340 回答