无法对非静态字段进行静态引用

时间:2011-11-12 00:42:44

标签: java

如果此代码格式不正确,我会提前道歉,尝试粘贴而不是重新输入每一行。如果它不对,有人可以告诉我一次粘贴多行代码的简单方法吗?

我的主要问题是我不断收到一条错误消息:Cannot make a static reference to the non-static field balance.

我已经尝试将方法设置为静态,没有结果,并通过从标题中删除“静态”使主方法非静态,但随后我收到消息:java.lang.NoSuchMethodError: main Exception in thread "main"

有没有人有任何想法?任何帮助表示赞赏。

public class Account {

    public static void main(String[] args) {
        Account account = new Account(1122, 20000, 4.5);

        account.withdraw(balance, 2500);
        account.deposit(balance, 3000);
        System.out.println("Balance is " + account.getBalance());
        System.out.println("Monthly interest is " + (account.getAnnualInterestRate()/12));
        System.out.println("The account was created " + account.getDateCreated());
    }

    private int id = 0;
    private double balance = 0;
    private double annualInterestRate = 0;
    public java.util.Date dateCreated;

    public Account() {
    }

    public Account(int id, double balance, double annualInterestRate) {
        this.id = id;
        this.balance = balance;
        this.annualInterestRate = annualInterestRate;
    }

    public void setId(int i) {
        id = i;
    }

    public int getID() {
        return id;
    }

    public void setBalance(double b){
        balance = b;
    }

    public double getBalance() {
        return balance;
    }

    public double getAnnualInterestRate() {
        return annualInterestRate;
    }

    public void setAnnualInterestRate(double interest) {
        annualInterestRate = interest;
    }

    public java.util.Date getDateCreated() {
        return this.dateCreated;
    }

    public void setDateCreated(java.util.Date dateCreated) {
        this.dateCreated = dateCreated;
    }

    public static double withdraw(double balance, double withdrawAmount) {
        double newBalance = balance - withdrawAmount;
        return newBalance;
    }

    public static double deposit(double balance, double depositAmount) {
        double newBalance = balance + depositAmount;
        return newBalance;
    }   
}

6 个答案:

答案 0 :(得分:13)

main是一种静态方法。它不能引用balance,它是一个属性(非静态变量)。 balance仅在通过对象引用(例如myAccount.balanceyourAccount.balance)引用时才有意义。但是当它通过类引用时没有任何意义(例如Account.balance(其余额是那个?)。

我对您的代码进行了一些更改,以便进行编译。

public static void main(String[] args) {
    Account account = new Account(1122, 20000, 4.5);
    account.withdraw(2500);
    account.deposit(3000);

public void withdraw(double withdrawAmount) {
    balance -= withdrawAmount;
}

public void deposit(double depositAmount) {
    balance += depositAmount;
}   

答案 1 :(得分:6)

account.withdraw(balance, 2500);
account.deposit(balance, 3000);

你可能想要撤销并存入非静态的,并让它修改余额

public void withdraw(double withdrawAmount) {
    balance = balance - withdrawAmount;
}

public void deposit(double depositAmount) {
    balance = balance + depositAmount;
}   

并从通话中删除balance参数

答案 2 :(得分:1)

撤回和存款的静态电话是您的问题。         account.withdraw(余额,2500); 此行无法使用,因为“balance”是Account的实例变量。无论如何,代码没有多大意义,不会将提取/存入封装在Account对象本身内?所以退出应该更像是

public void withdraw(double withdrawAmount)
{
    balance -= withdrawAmount;
}

当然,根据您的问题,您可以在此处进行额外验证,以防止出现负余额等。

答案 3 :(得分:1)

您正试图直接从静态方法访问非静态字段,这在java中是不合法的。 balance是一个非静态字段,因此要么使用对象引用访问它,要么将其设置为静态。

答案 4 :(得分:0)

只需写下:

private static double balance = 0;

你也可以写那些:

private static int id = 0;
private static double annualInterestRate = 0;
public static java.util.Date dateCreated;

答案 5 :(得分:-1)

如果您愿意,可以保留撤销和存款方式,但是您必须像下面的代码一样编写。 sb =起始余额和eB =期末余额。

Account account = new Account(1122, 20000, 4.5);

    double sB = Account.withdraw(account.getBalance(), 2500);
    double eB = Account.deposit(sB, 3000);
    System.out.println("Balance is " + eB);
    System.out.println("Monthly interest is " + (account.getAnnualInterestRate()/12));
    account.setDateCreated(new Date());
    System.out.println("The account was created " + account.getDateCreated());