我正在尝试在课堂上使用收费的方法。方法是这样的:
public double chargeFee()
{
balance -= 10;
return balance;
}
然而,它减去了20.我已经尝试重新编译它,但我找不到导致问题的原因。
完整代码:
public class ManageAccounts
{
public static void main(String[] args)
{
Account acct1, acct2;
//create account1 for Sally with $1000
acct1 = new Account(1000, "Sally", 1111);
acct2 = new Account(500, "Joe", 2222);//create account2 for Joe with $500
System.out.println("Depositing $100 into Account 2222...");
acct2.deposit(100.00);//deposit $100 to Joe's account
System.out.println("New Balance for Account 2222: $" + acct2.getBalance());//print Joe's new balance (use getBalance())
System.out.println();
System.out.println("Withdrawing $50 from Account 1111...");
acct1.withdraw(50);//withdraw $50 from Sally's account
System.out.println("New Balance for Account 1111: $" + acct1.getBalance());//print Sally's new balance (use getBalance())
System.out.println();
acct1.chargeFee();
acct2.chargeFee();//charge fees to both accounts
System.out.println("Charging usage Fees...");
System.out.println("Account balance after fees:");
System.out.println("Account 1111: $" + acct1.chargeFee());
System.out.println("Account 2222: $" + acct2.chargeFee());
System.out.println();
System.out.println("Changing name on Account 2222...");
acct2.changeName("Joseph");//change the name on Joe's account to Joseph
System.out.println();
System.out.println("Printing account summaries...");
System.out.println(acct1.toString());
System.out.println(acct2.toString());//print summary for both accounts
}
}
import java.text.NumberFormat;
public class Account
{
private double balance;
private String name;
private long acctNum;
NumberFormat money = NumberFormat.getCurrencyInstance();
//----------------------------------------------
//Constructor -- initializes balance, owner, and account number
//----------------------------------------------
public Account(double initBal, String owner, long number)
{
balance = initBal;
name = owner;
acctNum = number;
}
//----------------------------------------------
// Checks to see if balance is sufficient for withdrawal.
// If so, decrements balance by amount; if not, prints message.
//----------------------------------------------
public void withdraw(double amount)
{
if (balance >= amount)
balance -= amount;
else
System.out.println("Insufficient funds");
}
//----------------------------------------------
// Adds deposit amount to balance.
//----------------------------------------------
public void deposit(double amount)
{
balance += amount;
}
//----------------------------------------------
// Returns balance.
//----------------------------------------------
public double getBalance()
{
return balance;
}
//----------------------------------------------
// Returns a string containing the name, account number, and balance.
//----------------------------------------------
public String toString()
{
return ("Name: " + name + "\tAccount Number: " + acctNum + "\tBalance: " + money.format(balance));
}
//----------------------------------------------
// Deducts $10 service fee
//----------------------------------------------
public double chargeFee()
{
balance -= 10;
return balance;
}
//----------------------------------------------
// Changes the name on the account
//----------------------------------------------
public void changeName(String newName)
{
name = newName;
}
}
一些示例输出:
Depositing $100 into Account 2222...
New Balance for Account 2222: $600.0
Withdrawing $50 from Account 1111...
New Balance for Account 1111: $950.0
Charging usage Fees...
Account balance after fees:
Account 1111: $930.0
Account 2222: $580.0
Changing name on Account 2222...
Printing account summaries...
Name: Sally Account Number: 1111 Balance: $930.00
Name: Joseph Account Number: 2222 Balance: $580.00
答案 0 :(得分:7)
您在两个帐户上都会拨打chargeFee
两次,一次是在收取实际费用时,又是在打印结果时再次。
为了将来参考,我们有一个名为"Seperate command and query"或CQS的指南。您可能想要阅读它。为了说明你的情况:
chargeFee
作为查询(即退还余额)chargeFee
作为命令,扣除金钱。更改chargeFee
以返回void
(或this
,如果您想要方法链接),并且您不会意外地将其用作查询。
答案 1 :(得分:3)
每个帐户扣除2笔费用。
acct1.chargeFee();
acct2.chargeFee();//charge fees to both accounts
System.out.println("Charging usage Fees...");
System.out.println("Account balance after fees:");
System.out.println("Account 1111: $" + acct1.chargeFee());
System.out.println("Account 2222: $" + acct2.chargeFee());
可以说,chargeFee()
不应该返回余额,而应void
deposit()
或withdraw()
。另请注意,财务问题通常以int
而不是double
号码处理。
答案 2 :(得分:2)
System.out.println("New Balance for Account 1111: $" + acct1.getBalance());//print Sally's new balance (use getBalance())
System.out.println();
acct1.chargeFee();------------------------//First time
acct2.chargeFee();//charge fees to both accounts
System.out.println("Charging usage Fees...");
System.out.println("Account balance after fees:");
System.out.println("Account 1111: $" + acct1.chargeFee());------------------------//second time
System.out.println("Account 2222: $" + acct2.chargeFee());
答案 3 :(得分:2)
1)
acct1.chargeFee();
acct2.chargeFee();//charge fees to both accounts
2)
System.out.println("Account 1111: $" + acct1.chargeFee());
System.out.println("Account 2222: $" + acct2.chargeFee());
请注意您如何两次致电chargeFee()
。这就是给你搞砸了的结果。您只需要调用一次,然后只需在第二次打印每个帐户中的余额(第2部分)。
System.out.println("Account 1111: $" + Account 1111's balance);
System.out.println("Account 2222: $" + Account 2222's balance);
希望有所帮助!
答案 4 :(得分:1)
您已经有几个正确的答案指出了程序中的问题。这不是一个真正的答案,而是对你如何自己发现这个问题的扩展评论。
根据理论,理论是chargeFee减去20的方法,下一步是添加断点或打印输出来检查它的真正作用。:
public double chargeFee() {
System.out.println("Before subtract: " + balance + " Account: " + acctNum);
balance -= 10;
System.out.println("After subtract: " + balance + " Account: " + acctNum);
return balance;
}
带有附加打印输出的程序输出很明显,每次对chargeFee的调用仅减去10,但每个帐户调用两次。