2011-11-12 2 views
6

Je m'excuse à l'avance si ce code n'est pas formaté correctement, en essayant de coller au lieu de retaper chaque ligne. Si ce n'est pas correct, quelqu'un peut-il me dire un moyen facile de coller plusieurs lignes de code à la fois?ne peut pas faire une référence statique au champ non-statique

Ma question principale est que je continue à recevoir un message d'erreur indiquant: Cannot make a static reference to the non-static field balance.

J'ai essayé de faire les méthodes statiques, sans résultat, et rendant la principale méthode non statique en supprimant « statique » de l'en-tête , mais ensuite je reçois le message: java.lang.NoSuchMethodError: main Exception in thread "main"

Quelqu'un a-t-il des idées? Toute aide est appréciée.

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 "ne suis pas sûr de savoir pourquoi vous avez même l'équilibre comme argument à la account.withdraw() et account.deposit(). Depuis compte _knows_ l'équilibre, la réponse la plus simple est de les retirer des méthodes Alternativement, si vous les voulez vraiment, vous devez dire account.balance dans les appels de main(). – user949300

+1

comme pour le formatage des onglets de changement à des espaces et sélectionnez le code après que vous avez collé et appuyez sur ctrl-k pour indentation automatique –

Répondre

6

les lignes

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

vous voudrez peut-être faire retirer et non statique dépôt et laissez modifier l'équilibre

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

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

et supprimez le paramètre de balance de l'appel

1

Les appels statiques à retirer et à déposer sont votre problème. compte.traitement (solde, 2500); Cette ligne ne peut pas fonctionner, car "balance" est une variable d'instance de Account. Le code n'a pas beaucoup de sens de toute façon, ne pas retirer/déposer être encapsulé dans l'objet compte lui-même? de sorte que le retrait devrait être plus comme

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

Bien sûr, en fonction de votre problème, vous pourriez faire une validation supplémentaire ici pour éviter un solde négatif, etc.

10

main est une méthode statique. Il ne peut pas faire référence à balance, qui est un attribut (variable non statique). balance n'a de sens que lorsqu'il est référencé via une référence d'objet (par exemple myAccount.balance ou yourAccount.balance). Mais il n'a aucune signification quand il est référencé à travers la classe (comme Account.balance (dont l'équilibre est que?))

J'ai apporté quelques modifications à votre code afin qu'il compile.

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

et:

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

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

Il suffit d'écrire:

private static double balance = 0; 

et vous pouvez aussi écrire ceux comme ça:

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

Vous essayez d'accéder à champ non statique directement à partir de la méthode statique qui n'est pas le gal en Java. balance est un champ non statique, donc soit y accéder en utilisant la référence de l'objet ou le rendre statique.

-1

vous pouvez garder vos méthodes de retrait et de dépôt statiques si vous voulez mais vous devrez l'écrire comme le code ci-dessous. Sb = solde initial et eB = solde 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()); 
Questions connexes