imansible creare un riferimento statico al campo non statico

Mi scuso in anticipo se questo codice non è formattato correttamente, cercando di incollare invece di ridigitare ogni riga. Se non è giusto, qualcuno può dirmi un modo semplice per incollare più righe di codice contemporaneamente?

La mia domanda principale è che continuo a ricevere un messaggio di errore che dice: Cannot make a static reference to the non-static field balance.

Ho provato a rendere statici i metodi, senza risultato, e rendendo il metodo principale non statico rimuovendo “statico” dall’intestazione, ma poi ottengo il messaggio: java.lang.NoSuchMethodError: main Exception in thread "main"

Qualcuno ha qualche idea? Qualsiasi aiuto è apprezzato.

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

le linee

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

potresti voler ritirare e depositare non-statico e lasciare che modifichi il bilancio

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

e rimuovere il parametro di equilibrio dalla chiamata

main è un metodo statico. Non può riferirsi al balance , che è un attributo (variabile non statica). balance ha significato solo quando è riferito attraverso un riferimento a un object (come myAccount.balance o yourAccount.balance ). Ma non ha alcun significato quando viene riferito attraverso la class (come ad esempio Account.balance (di chi è l’equilibrio?))

Ho apportato alcune modifiche al codice in modo che venga compilato.

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

e:

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

Le chiamate statiche a prelevare e depositare sono il tuo problema. account.withdraw (balance, 2500); Questa linea non può funzionare, poiché “balance” è una variabile di istanza di Account. Il codice non ha molto senso comunque, non si ritirerebbe / depositare l’incapsulato all’interno dell’object Account stesso? quindi il ritiro dovrebbe essere più simile

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

Ovviamente, a seconda del problema, è ansible eseguire ulteriori convalide per evitare l’equilibrio negativo ecc.

Stai provando ad accedere al campo non statico direttamente dal metodo statico che non è legale in java. balance è un campo non statico, quindi accedilo usando il riferimento all’object o rendilo statico.

Scrivi e basta:

 private static double balance = 0; 

e potresti anche scrivere quelli del genere:

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

puoi mantenere i metodi di prelievo e deposito statici se vuoi, ma dovresti scriverlo come il codice qui sotto. sb = balance iniziale e eB = saldo finale.

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