【发布时间】:2015-05-26 10:39:40
【问题描述】:
我的学业需要帮助,我对编程非常陌生。所以要求是:
类帐户,将所有数据的可见性更改为受保护。更改withdraw方法,使其成为抽象方法。此操作将需要您将类声明为抽象类。存款在 OnLineAccount 和 SavingsAccount 中的工作方式应相同,因此请确保它们不能覆盖其父版本的版本。
OnLineAccount 类比 Account 类多了一个属性 minimumBalance。 OnLineAccount 的所有实例都是在将 minimumBalance 金额设置为 $500 的情况下创建的。如果任何 OnLineAccount 的交易导致余额低于 minimumBalance,则从账户余额中扣除 25 美元的费用。覆盖
toString方法以显示帐户toString显示的所有内容以及取决于余额的消息。如果余额低于 minimumBalance,则需要提示客户已扣除 25 美元费用的消息。使用父类toString完成大部分工作。SavingsAccount 类比 Account 类的属性多了一个属性,即透支。所有 SavingsAccount 实例都是在透支金额设置为 -$1000 的情况下创建的。透支金额是 SavingsAccount 类的对象可能允许余额达到的金额。实施提款方法,以便透支最多可达到透支中存储的金额。允许余额降至零以下并达到透支金额的任何提款都是允许的,但每次交易导致余额低于零时,都会产生 30 美元的透支费。 覆盖
toString方法以显示帐户toString的所有内容 显示加上一条取决于天平的消息。如果余额低于零,则说明此人处于透支状态且已产生 30 美元费用的消息。使用父类toString完成大部分工作。创建一个包含 5 个 Account 对象数组的驱动程序类,作为子类 OnLineAccount 或 SavingsAccount 的一些实例。系统地测试两个子类的全部功能。
=================================
所以我创建了 4 个类文件,它显示所有帐户信息,但也显示负余额,这应该是一条错误消息,而不是因为余额不应低于 500 美元。
这是我的类文件:
账户类:
import java.text.NumberFormat;
import java.util.Locale;
public abstract class Account {
private static int defaultAccountNo = 12345;
protected String owner;
protected int accountNo;
protected double balance;
protected Account(String owner, double intialDeposit){
this.owner = owner;
this.balance = intialDeposit;
defaultAccountNo++;
this.accountNo = defaultAccountNo;
}
public final boolean deposit(double amount){
if(amount<=0){
System.err.println("Negative amount can't be deposited");
return false;
}
balance = balance+amount;
return true;
}
protected abstract boolean withdrawl(double amount);
public String getBalance(){
return formatter.format(balance);
}
public int getAccountNo(){
return accountNo;
}
public void setOwner(String owner){
this.owner = owner;
}
protected void addInterest(){
double interest = 0.05*balance;
balance = balance+interest;
}
public boolean equals(Account account){
if(this.owner.equalsIgnoreCase(account.owner))
return true;
else
return false;
}
NumberFormat formatter = NumberFormat.getCurrencyInstance();
public String toString(){
return "AccountNo: "+accountNo+"\nBalance: "+formatter.format(balance);
}
}
OnlineAccount 类:
public class OnLineAccount extends Account{
public OnLineAccount(String owner, double intialDeposit) {
super(owner, intialDeposit);
}
private static final double MINIMUM_BALANCE = 500;
public boolean withdrawl(double amount){
if(amount<0){
System.err.println("Negative amount cannot be withdrawn");
return false;
}
if((balance-amount)<0){
System.err.println("Not enought balance");
return false;
}
balance = balance-amount;
if(balance<MINIMUM_BALANCE)
balance = balance - 25;
return true;
}
public String toString(){
String returnString;
if(balance<500){
returnString = super.toString()+"\n$25 fee has been already been subtracted as account balance reached below minimum";
return returnString;
}
return super.toString();
}
}
SavingsAccount 类:
public class SavingsAccount extends Account{
private static final double DEFAULT_OVERDRAFT = -1000;
public SavingsAccount(String owner, double intialDeposit) {
super(owner, intialDeposit);
}
public boolean withdrawl(double amount) {
if(amount<0){
System.err.println("Negative amount cannot be withdrawn");
return false;
}
if((balance-amount-30)<DEFAULT_OVERDRAFT){
System.err.println("Not enough balance, overdraft reached");
}
if((balance-amount)<0){
balance = balance-amount-30;
return true;
}
return false;
}
public String toString(){
String returnString;
if(balance<500){
returnString = super.toString()+"\nYour are in overdraft and $30 fee has been already been subtracted.";
return returnString;
}
return super.toString();
}
}
TestAccount 类:
import java.util.Random;
public class TestAccount {
public static void main(String[] args) {
Random ran = new Random();
Account[] accountArray = new Account[5];
Account acc1 = new OnLineAccount("Bill", 1000);
Account acc2 = new OnLineAccount("Susan", 1500);
Account acc3 = new SavingsAccount("William", 2500);
Account acc4 = new SavingsAccount("Bill", 9000);
Account acc5 = new SavingsAccount("Bruce", 1355);
accountArray[0] = acc1;
accountArray[1] = acc2;
accountArray[2] = acc3;
accountArray[3] = acc4;
accountArray[4] = acc5;
for(int i=0; i<accountArray.length; i++){
System.out.println("Initial details of Account....");
System.out.println(accountArray[i]);
System.out.println("After some transactions..");
accountArray[i].deposit(ran.nextInt(300));
accountArray[i].withdrawl(ran.nextInt(3000
));
System.out.println("Balance: "+accountArray[i].getBalance());
System.out.println("After adding the interest for the year....");
accountArray[i].addInterest();
System.out.println("Balance: "+accountArray[i].getBalance());
System.out.println(); // for blank line
}
System.out.println("Checking for Duplicates now....");
for(int i=0; i<accountArray.length; i++){
for(int j=0; j<i; j++){
if(accountArray[i].equals(accountArray[j])){
System.out.println("Account "+accountArray[i].getAccountNo()+
" and "+accountArray[j].getAccountNo()+" are duplicates");
}
}
}
}
}
我花了几个小时没有运气。任何帮助将非常感激。谢谢。 这是我在这里的第一篇文章。
我得到的输出是(帐号 12350 的余额为负数...):
【问题讨论】:
-
只是说:这是一个很好的“第一个”问题。你提供了很多细节;很明显,您不希望我们为您做作业。尽管如此,显示测试程序的输出可能会有所帮助;并指出你得到意外结果的确切位置。还有另一个提示:您可能会考虑在错误场景中抛出异常(而不是打印到 stderr 并返回 false)。这有一个很大的优势:您的程序在第一个“错误情况”处就停在那里。
-
同意 - 第一个问题很好。在我回答之前,我认为它可能是 - 当你输出跟随交易时 - 你直接调用
accountArray[i].getBalance()- 绕过部分您警告toString()中的无效余额/费用-我认为如果您再次使用accountArray[i].toString()输出-您将看到警告消息。另外 - 一个提示 - 当你遇到你不理解的行为时 - 在你调试时临时用固定值替换随机值 -
非常感谢@J Richard Snape 和 EddyG,在采纳了您的建议后,情况有所好转。