2011-11-12 9 views
6

Me disculpo por adelantado si este código no está formateado correctamente, tratando de pegar en lugar de volver a escribir cada línea. Si no está bien, ¿alguien puede decirme una forma fácil de pegar varias líneas de código a la vez?no se puede hacer una referencia estática al campo no estático

Mi pregunta principal es que me aparece un mensaje de error que indica: Cannot make a static reference to the non-static field balance.

He intentado hacer los métodos estáticos, sin resultado, y haciendo que el principal método no estático mediante la eliminación de "estática" de la cabecera , pero luego aparece el mensaje: java.lang.NoSuchMethodError: main Exception in thread "main"

¿Alguien tiene alguna idea? Cualquier ayuda es apreciada.

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

I "No estoy seguro de por qué ni siquiera tiene el equilibrio como un argumento a la account.withdraw() y account.deposit() métodos. Desde _knows_ cuenta el equilibrio, la respuesta más simple es para sacarlos de los métodos Alternativamente, si realmente los quiere, debe decir account.balance en las llamadas de main(). – user949300

+1

como para formatear las pestañas de cambio en espacios y seleccionar el código después de haber pegado y presionar ctrl-k para auto sangría –

Respuesta

6

las líneas

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

es posible que desee hacer retirar y depositar no estático y dejar que se modifica el equilibrio

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

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

y quitar el parámetro de balance de la llamada

1

Las llamadas estáticas para retirar y depositar son su problema. account.withdraw (saldo, 2500); Esta línea no puede funcionar, ya que "saldo" es una variable de instancia de Cuenta. El código no tiene mucho sentido de todos modos, ¿no se podría encapsular/retirar el depósito dentro del objeto de la cuenta en sí? por lo que la retiren debería ser más como

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

Por supuesto, dependiendo de su problema que podría hacer una validación adicional para prevenir saldo negativo etc.

10

main es un método estático. No puede hacer referencia a balance, que es un atributo (variable no estática). balance tiene significado solo cuando se lo refiere a través de una referencia de objeto (como myAccount.balance o yourAccount.balance). Pero no tiene ningún significado cuando se refiere a través de la clase (como Account.balance (¿qué balance es ese?))

He hecho algunos cambios en el código para que se compile.

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

y:

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

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

acaba de escribir:

private static double balance = 0; 

y también se podría escribir aquellos como que:

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

Usted está intentando acceder campo no estático directamente desde el método estático que no es le gal en java. balance es un campo no estático, por lo tanto, acceda a él utilizando la referencia de objeto o establézcalo como estático.

-1

Puede mantener sus métodos de retiro y depósito estáticos si lo desea, sin embargo, tendría que escribirlos como en el siguiente código. sb = saldo inicial y eB = saldo final.

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