2011-11-12 72 views
6

Tôi xin lỗi trước nếu mã này không được định dạng chính xác, cố gắng dán thay vì nhập lại từng dòng. Nếu nó không đúng, ai đó có thể cho tôi biết một cách dễ dàng để dán nhiều dòng mã cùng một lúc?không thể tham chiếu tĩnh đến trường không tĩnh

câu hỏi chính của tôi là tôi tiếp tục nhận được một thông báo lỗi: Cannot make a static reference to the non-static field balance.

Tôi đã cố gắng làm cho phương pháp tĩnh, không có kết quả, và làm cho phương pháp chính không tĩnh bằng cách loại bỏ "tĩnh" từ tiêu đề , nhưng sau đó tôi nhận được thông báo: java.lang.NoSuchMethodError: main Exception in thread "main"

Có ai có ý tưởng nào không? Bất kỳ trợ giúp được đánh giá cao.

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

Tôi "không chắc chắn lý do tại sao bạn thậm chí có số dư làm đối số cho phương thức account.withdraw() và account.deposit(). Vì tài khoản _knows_ số dư, câu trả lời đơn giản nhất là xóa chúng khỏi phương thức Ngoài ra, nếu bạn thực sự muốn chúng, bạn cần phải nói account.balance trong các cuộc gọi từ main() – user949300

+1

để định dạng tab thay đổi thành dấu cách và chọn mã sau khi bạn đã dán và nhấn ctrl-k để tự động thụt lề –

Trả lời

6

các dòng

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

bạn có thể muốn làm cho thu hồi và tiền gửi không tĩnh và để cho nó thay đổi sự cân bằng

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

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

và loại bỏ các tham số cân bằng từ các cuộc gọi

1

Các cuộc gọi tĩnh để rút tiền và gửi tiền là vấn đề của bạn. account.withdraw (balance, 2500); Dòng này không thể hoạt động vì "số dư" là một biến mẫu của Tài khoản. Mã không có ý nghĩa nhiều anyway, sẽ không rút tiền/tiền gửi được đóng gói bên trong các đối tượng tài khoản chính nó? nên rút nên được nhiều hơn như

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

Tất nhiên tùy thuộc vào vấn đề của bạn, bạn có thể làm xác nhận bổ sung ở đây để ngăn chặn dư âm, vv

10

main là một phương pháp tĩnh. Nó không thể tham chiếu đến balance, là một thuộc tính (biến không tĩnh). balance chỉ có nghĩa khi nó được giới thiệu qua một tham chiếu đối tượng (chẳng hạn như myAccount.balance hoặc yourAccount.balance). Nhưng nó không có ý nghĩa gì khi nó được gọi qua lớp (chẳng hạn như Account.balance (số dư của nó là gì?))

Tôi đã thực hiện một số thay đổi đối với mã của bạn để biên dịch.

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

và:

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

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

Chỉ cần viết:

private static double balance = 0; 

và bạn cũng có thể viết những như thế:

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

Bạn đang cố gắng truy cập vào lĩnh vực phi tĩnh trực tiếp từ phương thức tĩnh không phải là le gal trong java. số dư là một trường không tĩnh, do đó, hoặc truy cập nó bằng cách sử dụng tham chiếu đối tượng hoặc làm cho nó tĩnh.

-1

bạn có thể giữ phương thức rút tiền và ký quỹ của mình tĩnh nếu bạn muốn tuy nhiên bạn phải viết nó như mã bên dưới. sb = số dư ban đầu và eB = số dư cuối kỳ.

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()); 
Các vấn đề liên quan