Java 复制构造函数银行帐户问题

Posted

技术标签:

【中文标题】Java 复制构造函数银行帐户问题【英文标题】:Java copy constructor bank account issues 【发布时间】:2012-08-30 20:51:46 【问题描述】:

在我的学校开始深入学习 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());



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 个小时尝试不同的方法,得到相同或更差的结果。希望有人能指出我哪里出错了。谢谢大家。

【问题讨论】:

【参考方案1】:

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

//Copy constructor

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

【讨论】:

【参考方案2】:

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

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

    savingsNumber++;

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


【讨论】:

尝试让我在所有者和余额上都出现错误,说“BankAccount.owner/balance 不可见” 您应该为基类中的成员引入公共设置器或使成员受保护。

以上是关于Java 复制构造函数银行帐户问题的主要内容,如果未能解决你的问题,请参考以下文章

Java 默认构造函数问题 - 啥实际上构成了“默认构造函数”? [复制]

为啥Java没有复制构造函数?

如果类具有参数化构造函数,为啥Java不提供默认构造函数? [复制]

不调用复制构造函数,但调用默认构造函数 java

java怎么样构造函数复制一个对象

C ++中的构造函数初始化[重复]