kan geen statische verwijzing naar het niet-statische veld maken

Ik verontschuldig me van tevoren als deze code niet juist is geformatteerd, probeer ik in plaats van elke lijn opnieuw te typen. Als het niet goed is, kan iemand me dan een eenvoudige manier geven om meerdere regels code tegelijk te plakken?

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"

Heeft iemand ideeën? Alle hulp wordt gewaardeerd.

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
Ik weet niet zeker waarom je zelfs een balans hebt als argument voor de methoden account.withdraw() en account.deposit (). Aangezien account weet het saldo, is het eenvoudigste antwoord om ze te verwijderen van de Als u echt wilt, moet u account.balance in de aanroepen van main() vermelden.
toegevoegd de auteur user949300, de bron
voor het opmaken van tabbladen wijzigen in spaties en de code selecteren nadat je hebt geplakt en druk op ctrl-k om automatisch te laten inspringen
toegevoegd de auteur ratchet freak, de bron

6 antwoord

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

Ik heb enkele wijzigingen aangebracht in je code zodat deze compileert.

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

en:

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

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

de lijnen

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

je zou het misschien willen laten opnemen en niet-statisch deponeren en het de balans laten wijzigen

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

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

en verwijder de balansparameter uit de oproep

6
toegevoegd

U probeert rechtstreeks toegang te krijgen tot niet-statische velden van de statische methode die niet legaal is in Java. balans is een niet-statisch veld, dus open het met objectreferentie of maak het statisch.

1
toegevoegd

De statische oproepen tot intrekking en storting zijn uw probleem.         account.withdraw (saldo, 2500); Deze regel kan niet werken, omdat 'balans' een instantievariabele is van Account. De code heeft sowieso niet zoveel zin, zou niet intrekken/storten worden ingekapseld in het Account-object zelf? dus de opname zou meer moeten lijken

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

Natuurlijk, afhankelijk van uw probleem, kunt u hier extra validatie uitvoeren om een ​​negatief saldo enz. Te voorkomen.

1
toegevoegd

je kunt je opname- en stortingsmethoden statisch houden als je dat wilt, maar je moet het schrijven zoals de onderstaande code. sb = beginsaldo en eB = eindbalans.

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
toegevoegd

Schrijf gewoon:

private static double balance = 0;

en je zou ook zo kunnen schrijven:

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