не можа зрабіць статычную спасылку на нестатическое поле

Я прашу прабачэння загадзя, калі гэты код адфарматаваны няправільна, спрабуючы ўставіць замест перадрукоўваць кожную радок. Калі гэта не так, можа хто-небудзь сказаць мне просты спосаб ўставіць некалькі радкоў кода адразу?

My main question is that I keep getting an error message stating: Cannot make a static reference to the non-static field balance.

I have tried making the methods static, with no result, and making the main method non-static by removing "static" from the header, but then I get the message: 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;
    }   
}
7
Я "не ўпэўнены, чаму вы нават баланс у якасці аргумента на account.withdraw() і account.deposit() метаду. Паколькі уліковы запіс <�я> ведаю </я> баланс, самы просты адказ, каб выдаліць іх з метады. з іншага боку, калі вы сапраўды жадаеце іх, вы павінны сказаць account.balance ў званках ад асноўных ().
дададзена аўтар user949300, крыніца
як і для фарматавання ўкладак змены ў прабелы і выбраць код пасля таго, як вы ўставілі і націсніце Ctrl-K для аўтаматычнага водступу
дададзена аўтар ratchet freak, крыніца

6 адказы

main is a static method. It cannot refer to balance, which is an attribute (non-static variable). balance has meaning only when it is referred through an object reference (such as myAccount.balance or yourAccount.balance). But it doesn't have any meaning when it is referred through class (such as Account.balance (whose balance is that?))

Я зрабіў некаторыя змены ў свой код так, каб ён кампілюе.

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;
}   
11
дададзена

лініі

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

вы можаце зрабіць і зняць дэпазіт нестатическими і хай змяніць баланс

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

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

і выдаліце ​​параметр балансу з выкліку

6
дададзена

Вы спрабуеце атрымаць доступ да нонам статычнага поля непасрэдна ад статычнага метаду, які не з'яўляецца законным ў Java. Баланс ўяўляе сабой не статычнае поле, так што альбо доступ да яго з дапамогай спасылкі на аб'ект або зрабіць яго статычным.

1
дададзена

Статычныя выклікі зняць і ўнесці вашыя праблемы.         account.withdraw (баланс, 2500); Гэтая лінія не можа працаваць, бо «баланс» з'яўляецца зменнай асобніка рахунку. Код не мае сэнсу ў любым разе, не адгукнецца/дэпазіт быць увасоблены ўнутры самога аб'екта рахункі? таму адклікаць павінна быць больш як

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

Вядома ў залежнасці ад вашай праблемы вы маглі б зрабіць дадатковую праверку тут, каб прадухіліць адмоўны баланс і г.д.

1
дададзена

Вы можаце трымаць свае канфіскацыі і дэпазітныя статычныя метады, калі вы хочаце, аднак, вы павінны напісаць яго як код ніжэй. ча = стартавы баланс і ев = рэшту на канец перыяду.

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());
1
дададзена

Проста напішыце:

private static double balance = 0;

і вы маглі б таксама напісаць тыя, як гэта:

private static int id = 0;
private static double annualInterestRate = 0;
public static java.util.Date dateCreated;
0
дададзена