1

我有一个名为“帐户”的课程:

import java.util.Date;

public class Account {

    public int id = 0; //Declare default id as 0
    public double balance = 0; //Declare default balance as 0
    public double annualInterestRate = 0; //Declare default annual interest rate as 0
    public Date dateCreated = new Date(); //Declare date

    //No argument constructor for Account
    public Account() {
    id = 0;
    balance = 0.0;
    annualInterestRate = 0.0;
    }   

    //Constructor that accepts ID, Balance, and Annual Interest Rate
    public Account(int newID, double newBalance, double newAnnualInterestRate) {
    id = newID;
    balance = newBalance;
    annualInterestRate = newAnnualInterestRate;
    }  

    //Get ID
    public int getId() {
        return id;
    }

    //Set ID
    public void setId(int id) {
        this.id = id;
    }

    //Get Balance
    public double getBalance() {
        return balance;
    }

    //Set Balance
    public void setBalance(double balance) {
        this.balance = balance;
    }

    //Get Annual Interest Rate
    public double getAnnualInterestRate() {
        return annualInterestRate;
    }

    //Set Annual Interest Rate
    public void setAnnualInterestRate(double annualInterestRate) {
        this.annualInterestRate = annualInterestRate;
    }

    //Get Date Created
    public Date getDateCreated() {
        return dateCreated;
    }

    //Withdraw method
    double withdraw(double amount) {
    return balance -= amount;
    }

    //Deposit method 
    double deposit(double amount) {
    return balance += amount;
    }

    //Interest rate method
    double getMonthlyInterestRate() {
    return (balance * annualInterestRate) / 12;
   }

} //End Account class 

然后我创建了两个不同的子类“PreferredCustomer”和“CommercialCustomer”。这两个类应该继承主“Account”类的所有方法(存款、取款、月利率以及所有 getter 和 setter)。与子类别的唯一区别是它们具有预先确定的利率。

public class PreferredCustomer extends Account {

    public double annualInterestRate;

    public PreferredCustomer() {
    }

    public PreferredCustomer(int id, double balance) {
    super();
    this.annualInterestRate = .04;
    }

} //end PreferredCustomer Class

我有一种感觉,我目前的设置方式并不准确。测试时,提款和存款方法有效,但尽管输入了 20,000 美元的起始余额,它仍然将起始余额设置为 0 美元,并且不计算利率。

我正在测试这个类:

public class TestingAccountClass {

public static void main(String[] args) {

    //Create accounts
    CommercialCustomer myCommercialCustomerAccount = new CommercialCustomer(1124, 
          20000.00);

   //Invoking deposit method from account class
   myCommercialCustomerAccount.deposit(3000.00);

   //Display account balance, monthly interest, and date created
   System.out.println("\n\n----Commercial Account---");
   System.out.println("Account Created On: "
       + myCommercialCustomerAccount.getDateCreated());
   System.out.printf("Balance: $%.2f", myCommercialCustomerAccount.getBalance());
   System.out.printf("\nMonthly Interest: $%.2f"
       ,myCommercialCustomerAccount.getMonthlyInterestRate());

当以这种方式测试该类时,deposit 方法有效,但 account 类中的任何其他方法(除了取款)似乎都在工作。任何意见,将不胜感激。谢谢!

4

4 回答 4

4

你做:

CommercialCustomer myCommercialCustomerAccount = new CommercialCustomer(1124, 20000.00);

然而,

public PreferredCustomer(int id, double balance) {
    super();
    this.annualInterestRate = .04;
}

你不会对天平做任何事情!

您也许可以将其更改为:

public PreferredCustomer(int id, double balance) {
    super();
    this.balance = balance;
    this.annualInterestRate = .04;
}

但是你会写balance两次。

此外,让两个具有相同名称的变量(基础 vs 子)-> 是一个坏主意annualInterestRate

编辑 ------------------------------ 编辑

我会推荐这样的东西:

public Account() {
    this(0, 0d, 0d);
}  

public Account(int id, double balance, double interestRate) {
    this.id = id;
    this.balance = balance;
    this.annualInterestRate = interestRate;
}   

public PreferredCustomer(int id, double balance) {
    super(id, balance, 0.04d);
}

EDIT2 ------------------------------ EDIT2

这是错误的。你正在做整数除法。

return (balance * annualInterestRate) / 12;

改成这样:

return (balance * annualInterestRate) / 12d;

或这个:

return (balance * annualInterestRate) / 12.0;
于 2013-04-23T20:38:18.827 回答
1

PreferredCustomer没有设置平衡的机制;您忽略了balance构造函数参数。您没有直接分配balance实例变量,也没有调用超类构造函数。所以余额为0。

PreferredCustomer构造函数中,要么调用设置余额的超类构造函数,要么在构造函数本身中设置它,或者调用setBalance.

于 2013-04-23T20:37:58.800 回答
0

我认为问题出在此处:

public PreferredCustomer(int id, double balance) {
    super();
    this.annualInterestRate = .04;
    }

你不应该在 super() 调用中放一些东西吗?(默认值)

于 2013-04-23T20:40:16.300 回答
-1

警报!

首先,您永远不要公开您的非最终成员变量。我差点心脏病发作。

当你输入

this.foo

范围继续向上爬上固有树,直到找到可访问的成员。所以 this-->super-->super.super-->super.super.super --... 等等

我可以告诉你如何在语法上解决你的问题,或者告诉你如何做得更好。

我选择后者。

声明一个

public abstract double getAnnualInterestRate(); 

在你的基类中

然后改变你的 getMonthlyInterestRate 的实现(调用这个新方法)

   //Interest rate method
    double getMonthlyInterestRate() {
    return (balance * getAnnualInterestRate()) / 12;
   }

在您的子类中简单地实现这个抽象方法并返回您的利率。

这将允许您以多态方式改变速率并使您的实现面向未来。函数可以做任何事情来产生它们的返回值,其中成员变量只是一些数据,仅此而已

并且,请将您的所有成员变量设为私有

于 2013-04-23T20:45:30.377 回答