我试图让我的FlexibleSavings帐户和CDSavingsAccount每个月增加兴趣并显示它

时间:2014-10-27 19:56:40

标签: java inheritance polymorphism

我的flexiblesavingsaccount应该每年增加1.2%的利息,并且每月复合。另一方面,CD储蓄账户每年增加4%的利息和季度化合物。我已经设法让程序在第一个月增加了对余额的兴趣,但之后它就保持不变了。在零月份,它表示当灵活节能帐户需要2000时,余额为0,CDSavingsaccount需要3000。一旦程序通过12个月,它应该加起来两个帐户的余额。我觉得那部分是有效的,只是我现在得到的平衡是错误的

这是我的驱动程序类:     import java.util。*;

public class SavingsAccountDriver1{
public static void main(String[] args){
FlexibleSavingsAccount1 saver1 = new FlexibleSavingsAccount1(10002,2000); //could be              FlexibleSavingsAccount saver1
CDSavingsAccount1 saver2 = new CDSavingsAccount1(10003,3000);//CD SavingsAccount saver 2
saver1.annualInterestRate=.012;
saver2.annualInterestRate = .04;

int i;

System.out.println("Month\tAccount #   Balance\tAccount #   Balance");
System.out.println("-----\t---------   -------\t---------   -------");
System.out.print("    0");
printFlex(saver1);
printCD(saver2);
System.out.println();
for(i=1;i<=12;i++)
 {System.out.printf("%5d",i);
   printIntFlex(saver1);
   printIntCD(saver2);
    System.out.println();
   }
System.out.printf("Final balance of both accounts combined: %.2f\n",(saver1.getMonthlyInterest()+saver2.getMonthlyInterest()));

}
public static void printIntFlex(FlexibleSavingsAccount1 f){
    getIntFlex(f);
    printFlex(f);
}

public static void printIntCD(CDSavingsAccount1 c){
    getIntCD(c);
    printCD(c);
}

public static void printFlex(FlexibleSavingsAccount1 f){
    System.out.printf("%12d%10.2f ",f.getAccount_Number(),f.getMonthlyInterest());
}
 public static void printCD(CDSavingsAccount1 c){
    System.out.printf("%12d%10.2f ",c.getAccount_Number(),c.getMonthlyInterest());
}
public static void getIntFlex(FlexibleSavingsAccount1 f){
    f.addMonthlyInterest(f.getBalance());
}
public static void getIntCD(CDSavingsAccount1 c){
    c.addMonthlyInterest(c.getBalance());
}
}

这是我的SavingsAccount超类:     公共抽象类SavingsAccount1     {         私人双重平衡;         private final int ACCOUNT_NUMBER;

    public SavingsAccount1(){
        this.balance = 0.0;
        this.ACCOUNT_NUMBER =0;
    }
    public SavingsAccount1(int ACCOUNT_NUMBER, double balance)
{
    this.balance = balance;
    this.ACCOUNT_NUMBER = ACCOUNT_NUMBER;
}
public abstract void addMonthlyInterest(double balance);

public double getBalance()
{       return balance;
}
public void setBalance(double balance){
    this.balance = balance; 
}
 public int getAccount_Number()
{
     return ACCOUNT_NUMBER;
}
public String toString(){
    return String.format("%s", getAccount_Number());
}//end of toString
}

这是我的FlexibleSavingsAccount子类:

public class FlexibleSavingsAccount1 extends SavingsAccount1{

public static double annualInterestRate;
public static double b;

public FlexibleSavingsAccount1 (int ACCOUNT_NUMBER, double balance){
    super(ACCOUNT_NUMBER, balance);
}//end of 

@Override public void addMonthlyInterest(double balance){

    b =balance +(balance * (annualInterestRate / 12));
    this.b = b;
}
public double getMonthlyInterest(){
    return b;
}//end of getMonthlyInterest

public String toString(){
    return String.format("%s %s", super.toString(), getMonthlyInterest());
}//end of toString

} // FlexibleSavings帐户结束

这是我的CDSavingsAccount子类:

public class CDSavingsAccount1 extends SavingsAccount1{

public static double annualInterestRate;
public static double b;

public CDSavingsAccount1 (int ACCOUNT_NUMBER, double balance){
    super(ACCOUNT_NUMBER, balance);
}//end of 

@Override public void addMonthlyInterest(double balance){
    b =balance +(balance * (annualInterestRate / 4));
    this.b = b;
}
public double getMonthlyInterest(){
    return b;
}//end of getMonthlyInterest

public String toString(){
    return String.format("%s %s", super.toString(), getMonthlyInterest());
}//end of toString

} // CDSavings帐户结束

对不起所有的代码,我以前从未搞过多态或继承,我的老师真的很糟糕。我认为这是我的问题所在。你能给予的任何帮助都会很棒。

1 个答案:

答案 0 :(得分:0)

SavingsAccount1中更改构造函数以允许给出annualInterestRate参数。为它创建一个getter并完成它。

关于FlexibleSavingsAccount1类(由于与CDSavingsAccount1类的相似性,我将提及的所有内容都适用于这两个类:

扩展类时,您继承了父类的所有attributesmethods,因此无需在子类中定义annualInterestRate属性。你知道,这正是我们使用inheritance的原因。 1-这样我们就不会自己复习,并且不止一次输入相同的代码。 2-它允许我们强制共同的签名/行为。从抽象类扩展的类必须为抽象方法提供实现,或者必须本身是抽象的,再添加一层抽象。

此变量b主要用于保存monthlyInterest的值,但您似乎永远不会在设计中实际使用它。 ps:如果要保留它,则必须将其重命名为更有意义的内容,而不仅仅是b

所以,你应该消除这两个属性,因为你从不使用它们。

addMonthlyInterest方法中,您正在计算monthlyInterest的值并分配给b,然后您将b分配给自身。这显然是错误的,您需要更改帐户的实际余额。

public void addMonthlyInterest(double balance) {
  setBalance(balance + (balance * (annualInterestRate / 12)));
}

相当不言自明,我为余额设定了一个新值,即每月利息与当前余额之和的结果。

    FlexibleSavingsAccount1 saver1 = new FlexibleSavingsAccount1(10002, 2000, .012);
    CDSavingsAccount1 saver2 = new CDSavingsAccount1(10003, 3000, .04);                                                                     
    System.out.println("Month\tAccount #   Balance\tAccount #   Balance");
    System.out.println("-----\t---------   -------\t---------   -------");
    System.out.print("    0");
    print(saver1);
    print(saver2);
    System.out.println();
    for (int i = 1; i <= 12; i++) {
        System.out.printf("%5d", i);
        printInt(saver1);
        printInt(saver2);
        System.out.println();
    }
    System.out.printf("Final balance of both accounts combined: %.2f\n",
            (saver1.getBalance() + saver2.getBalance()));
}

FlexibleSavingsAccount1CDSavingsAccount1都是SavingsAccount1的类型,因此您可以通过更改方法签名以接受SavingsAccount1作为参数来消除您拥有的多个重复方法。< / p>

public static void printInt(SavingsAccount1 f) {
    getInt(f);
    print(f);
}
public static void print(SavingsAccount1 f) {
    System.out.printf("%12d%10.2f ", f.getAccount_Number(),
            f.getBalance());
}
public static void getInt(SavingsAccount1 f) {
    f.addMonthlyInterest(f.getBalance());
}

方法getInt(SavingsAccoutn1 f)是多态性的一个很好的例子。现在,您将使用两个子对象调用此方法,并且它们将根据其类中定义的自己的唯一实现添加addMonthlyInterest。这就是多态性的定义:两个相关但不同的对象获得相同的顺序但以不同的方式对其进行操作。

您应该将此方法重命名为更具说明性的内容。

最后,关于你的类命名约定的一个词,即你的所有类以1附加结尾的事实,例如SavingsAccount1结束,这让我觉得你没有完全掌握这个概念一个class。一个类是一个蓝图,它使我们能够创建许多相同类型的对象,因此它的名称似乎不应该是&#34;捆绑&#34;到任何特定的实例/对象。

注意:我同意MarsAtomic,你应该坚持使用BigDecimal类进行货币交易,以便不会失去精确度,但正如你所说,这是某种分配,我会假设BigDecimal是超出了老师教你的范围所以我只使用了双倍。