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 默认构造函数问题 - 啥实际上构成了“默认构造函数”? [复制]