Проблемы с банковским счетом в конструкторе копирования Java

Я начал глубоко изучать Java в моей школе, и я, наконец, ударил себя в стену, где я понятия не имею, где я иду не так. Я перечислю 4 класса, один из них - AccountDriver или основной метод, BankAccount, родительский класс, из которого получены CheckingAccount и SavingsAccount. Теперь моя проблема находится в SavingsAccount. Вот код...

AccountDriver

//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());

}
}

BankAccount (Родительский класс)

//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 часа, пытаясь разными методами получить одинаковые или худшие результаты. Надеюсь, кто-то может указать, где я иду не так. Спасибо большое, ребята.

2 ответа

В вашем конструкторе копирования вы должны инициализировать всех членов из переданного SavingsAccount например, как:

//Copy constructor

public SavingsAccount(SavingsAccount oldAccount, double amount)
{           
    super(oldAccount,amount);  //  <--- SUPER COPY CONSTRUCTOR CALLED
    savingsNumber++;
    accountNumber = oldAccount.accountNumber + Integer.toString(savingsNumber);
}

Владелец является членом класса BankAccount. Вы также должны указать владельца в вашем экземпляре ctor. Это также верно для других участников.

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

    savingsNumber++;

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

}
Другие вопросы по тегам