1

在我的学校开始深入学习 Java,我终于在我不知道哪里出错的地方碰壁了。我将列出 4 个类,一个是 AccountDriver 或 main 方法,BankAccount,它是 CheckingAccount 和 SavingsAccount 的父类。现在我的问题是在 SavingsAccount 中。这是代码...

帐户驱动程序

//Demonstrates the BankAccount and derived classes

import java.text.*;         // to use Decimal Format

public class AccountDriver
{
public static void main(String[] args)
{
    double put_in = 500;
    double take_out = 1000;

    DecimalFormat myFormat;
    String money;
    String money_in;
    String money_out;
    boolean completed;

    // to get 2 decimals every time
    myFormat = new DecimalFormat("#.00");

    //to test the Checking Account class
    CheckingAccount myCheckingAccount =
            new CheckingAccount ("Benjamin Franklin", 1000);
    System.out.println ("Account Number "
        + myCheckingAccount.getAccountNumber() +
        " belonging to " + myCheckingAccount.getOwner());
    money  = myFormat.format(myCheckingAccount.getBalance());
    System.out.println ("Initial balance = $" + money);
    myCheckingAccount.deposit (put_in);
    money_in = myFormat.format(put_in);
    money  = myFormat.format(myCheckingAccount.getBalance());
    System.out.println ("After deposit of $" + money_in
        + ",  balance = $" + money);
    completed = myCheckingAccount.withdraw(take_out);
    money_out = myFormat.format(take_out);
    money  = myFormat.format(myCheckingAccount.getBalance());
    if (completed)
    {
        System.out.println ("After withdrawal of $" + money_out
                + ",  balance = $" + money);
    }
    else
    {
        System.out.println ("Insuffient funds to withdraw $"
                + money_out + ",  balance = $" + money);
    }
    System.out.println();

    //to test the savings account class
    SavingsAccount yourAccount =
            new SavingsAccount ("William Shakespeare", 400);
    System.out.println ("Account Number "
            + yourAccount.getAccountNumber() +
            " belonging to " + yourAccount.getOwner());
    money  = myFormat.format(yourAccount.getBalance());
    System.out.println ("Initial balance = $" + money);
    yourAccount.deposit (put_in);
    money_in = myFormat.format(put_in);
    money  = myFormat.format(yourAccount.getBalance());
    System.out.println ("After deposit of $" + money_in
            + ",  balance = $" + money);
    completed = yourAccount.withdraw(take_out);
    money_out = myFormat.format(take_out);
    money  = myFormat.format(yourAccount.getBalance());
    if (completed)
    {
        System.out.println ("After withdrawal of $" + money_out
            + ",  balance = $" + money);
    }
    else
    {
        System.out.println ("Insuffient funds to withdraw $"
            + money_out + ",  balance = $" + money);
    }
    yourAccount.postInterest();
    money  = myFormat.format(yourAccount.getBalance());
    System.out.println ("After monthly interest has been posted,"
            + "balance = $" + money);
    System.out.println();


    // to test the copy constructor of the savings account class
    SavingsAccount secondAccount =
            new SavingsAccount (yourAccount,5);
    System.out.println ("Account Number "
            + secondAccount.getAccountNumber()+
            " belonging to " + secondAccount.getOwner());
    money  = myFormat.format(secondAccount.getBalance());
    System.out.println ("Initial balance = $" + money);
    secondAccount.deposit (put_in);
    money_in = myFormat.format(put_in);
    money  = myFormat.format(secondAccount.getBalance());
    System.out.println ("After deposit of $" + money_in
            + ", balance = $" + money);
    secondAccount.withdraw(take_out);
    money_out = myFormat.format(take_out);
    money  = myFormat.format(secondAccount.getBalance());
    if (completed)
    {
        System.out.println ("After withdrawal of $" + money_out
                + ",  balance = $" + money);
    }
    else
    {
        System.out.println ("Insuffient funds to withdraw $"
                + money_out + ",  balance = $" + money);
    }
    System.out.println();

    //to test to make sure new accounts are numbered correctly
    CheckingAccount yourCheckingAccount =
            new CheckingAccount ("Issac Newton", 5000);
    System.out.println ("Account Number "
            + yourCheckingAccount.getAccountNumber()
            + " belonging to "
            + yourCheckingAccount.getOwner());

}
}

银行账户(父类)

//Defines any type of bank account

public abstract class BankAccount
{
// class variable so that each account has a unique number
protected static int numberOfAccounts = 100001;

// current balance in the account
private double balance;
// name on the account
private String owner;
// number bank uses to identify account
private String accountNumber;

//default constructor
public BankAccount()
{
    balance = 0;
    accountNumber = numberOfAccounts + "";
    numberOfAccounts++;
}

//standard constructor
public BankAccount(String name, double amount)
{
    owner = name;
    balance = amount;
    accountNumber = numberOfAccounts + "";
    numberOfAccounts++;
}

//copy constructor
public BankAccount(BankAccount oldAccount, double amount)
{
    owner = oldAccount.owner;
    balance = amount;
    accountNumber = oldAccount.accountNumber;
}

//allows you to add money to the account
public void deposit(double amount)
{
    balance = balance + amount;
}

//allows you to remove money from the account if
//enough money is available
//returns true if the transaction was completed
//returns false if the there was not enough money
public boolean withdraw(double amount)
{
    boolean completed = true;

    if (amount <= balance)
    {
        balance = balance - amount;
    }
    else
    {
        completed = false;
    }
    return completed;
}

//accessor method to balance
public double getBalance()
{
    return balance;
}

//accessor method to owner
public String getOwner()
{
    return owner;
}

//accessor method to account number
public String getAccountNumber()
{
    return accountNumber;
}

//mutator method to change the balance
public void setBalance(double newBalance)
{
    balance = newBalance;
}

//mutator method to change the account number
public void setAccountNumber(String newAccountNumber)
{
    accountNumber = newAccountNumber;
}
}

支票账户

public class CheckingAccount extends BankAccount {

private double fee = .15;

private String accountNumber = getAccountNumber() + "-10";  

public CheckingAccount(String name, double amount) 
{

    super(name, amount);

    setAccountNumber(accountNumber);


}

public boolean withdraw(double amount)
{
    double finalAmount = amount + fee;

    super.withdraw(finalAmount);

    boolean completed = true;

    return completed;

}

}

最后,SavingsAccount

public class SavingsAccount extends BankAccount{

double rate = .025;

static int savingsNumber = 0;

private String accountNumber = super.getAccountNumber();


//Default constructor
public SavingsAccount(String name, double amount){

    super(name, amount);

    accountNumber = accountNumber + "-" + Integer.toString(savingsNumber);

}


//Copy constructor
public SavingsAccount(SavingsAccount oldAccount, double amount)
{           

    savingsNumber++;

    accountNumber = oldAccount.accountNumber + Integer.toString(savingsNumber);
}


public void postInterest(){
    double interestAmount = getBalance() * .025/12;

    double finalAmount = getBalance() + interestAmount;

    setBalance(finalAmount);
}


public String getAccountNumber()
{
    return accountNumber;
}

}

所以这里是 AccountDriver 运行时的输出......

Account Number 100001-10 belonging to Benjamin Franklin
Initial balance = $1000.00
After deposit of $500.00,  balance = $1500.00
After withdrawal of $1000.00,  balance = $499.85

Account Number 100002-0 belonging to William Shakespeare
Initial balance = $400.00
After deposit of $500.00,  balance = $900.00
Insuffient funds to withdraw $1000.00,  balance = $900.00
After monthly interest has been posted,balance = $901.88

Account Number 100002-01 belonging to null  **Should be 10002-1 and William Shakespeare**
Initial balance = $.00                      **Should be $5.00**
After deposit of $500.00, balance = $500.00 **Should be changed in accordance with an initial balance of $5.00
Insuffient funds to withdraw $1000.00,  balance = $500.00 **"   "**

Account Number 100004-10 belonging to Issac Newton **Should be # 10003-10

所以我的问题用星号列出,我花了 2 个小时尝试不同的方法,要么得到相同的结果,要么得到更差的结果。希望有人能指出我哪里出错了。谢谢一群人。

4

2 回答 2

1

在您的复制构造函数中,您应该初始化传递的SavingsAccount实例中的所有成员,例如:

//Copy constructor

public SavingsAccount(SavingsAccount oldAccount, double amount)
{           
    super(oldAccount,amount);  //  <--- SUPER COPY CONSTRUCTOR CALLED
    savingsNumber++;
    accountNumber = oldAccount.accountNumber + Integer.toString(savingsNumber);
}
于 2012-09-15T18:37:46.840 回答
0

所有者是 BankAccount 类的成员。您还必须在复制 ctor 中设置所有者成员。这也适用于其他成员。

  //Copy constructor
public SavingsAccount(SavingsAccount oldAccount, double amount)
{           

    savingsNumber++;

    accountNumber = oldAccount.accountNumber + Integer.toString(savingsNumber);
    owner = oldAccount.getOwner();
    balance = oldAccount.getBalance();
    //...

}
于 2012-09-06T05:15:07.277 回答