实验题目
创建客户账户。
实验目的
instanceof 运算符的应用。
提 示
- 修改 Customer 类来处理具有多种类型的联合账户。 (例如用数组表示多重性一节所作的,该类必须包括以下的公有方法: addAccount(Account),getAccount(int)和 getNumOfAccounts()。 每个 Customer 可以有多个 Account。(声明至少有 5 个)
- 完成 TestBanking 程序 该程序创建一个客户和账户的集合,并生成这些客户及其账户余额的报告。在 TestBanking.Java 文件中,你会发现注释块以/ ** * … ***/来开头和结尾。这 些注释只是必须提供的代码的位置。
- 使用 instanceof 操作符测试拥有的账户类型,并且将 account_type 设置 为适当的值,例如:“SavingsAccount”或“CheckingAccount”。
- 编译并运行该程序,将看到下列结果
CUSTOMERSREPORT================Customer: Simms, JaneSavingsAccount: currentbalanceis¥500.0CheckingAccount: currentbalanceis¥200.0Customer: Bryant, OwenCheckingAccount: currentbalanceis¥200.0Customer: Soley, TimSavingsAccount: currentbalanceis¥1500.0CheckingAccount: currentbalanceis¥200.0Customer: Soley, MariaCheckingAccount: currentbalanceis¥200.0SavingsAccount: currentbalanceis¥150.0
代码
【Account.java】类
packagebanking; publicclassAccount { protecteddoublebalance; //银行帐户的当前(或即时)余额//公有构造器 ,这个参数为 balance 属性赋值publicAccount(doubleinit_balance) { this.balance=init_balance; } //用于获取经常余额publicdoublegetBalance() { returnbalance; } /*** 向当前余额增加金额* @param amt 增加金额* @return 返回 true(意味所有存款是成功的)*/publicbooleandeposit(doubleamt){ balance+=amt; returntrue; } /*** 从当前余额中减去金额* @param amt 提款数目* @return 如果 amt小于 balance, 则从余额中扣除提款数目并返回 true,否则余额不变返回 false。*/publicbooleanwithdraw(doubleamt){ if (amt<balance){ balance-=amt; returntrue; }else{ returnfalse; } } }
【Customer.java】类
packagebanking; publicclassCustomer { privateStringfirstName; privateStringlastName; privateAccount[] accounts=newAccount[10]; privateintnumOfAccounts; publicCustomer(Stringf, Stringl) { this.firstName=f; this.lastName=l; } publicStringgetFirstName() { returnfirstName; } publicStringgetLastName() { returnlastName; } /*** 通过下标索引获取 account* @param index 下标索引* @return account*/publicAccountgetAccount(intindex) { returnaccounts[index]; } /*** 获取 numOfAccounts* @return numOfAccounts*/publicintgetNumOfAccounts() { returnnumOfAccounts; } /*** 添加 account,并将 numOfAccounts+1* @param acct account*/publicvoidaddAccount(Accountacct) { accounts[numOfAccounts++]=acct; } }
【Bank.java】类
packagebanking; /*** 银行类*/publicclassBank { privateCustomer[] customers; //Customer对象的数组privateintnumberOfCustomer; //整数,跟踪下一个 customers 数组索引/*** 公有构造器,以合适的最大尺寸(至少大于 5)初始化 customers 数组。*/publicBank() { customers=newCustomer[10]; } /*** 该方法必须依照参数(姓,名)构造一个新的 Customer 对象然后把它放到 customer 数组中。还必须把 numberOfCustomers 属性的值加 1。* @param f 姓* @param l 名*/publicvoidaddCustomer(Stringf,Stringl){ customers[numberOfCustomer++]=newCustomer(f,l); } /*** 通过下标索引获取 customer* @param index 下标索引* @return customer*/publicCustomergetCustomer(intindex) { returncustomers[index]; } publicintgetNumOfCustomers() { returnnumberOfCustomer; } }
【CheckingAccount.java】类
packagebanking; publicclassCheckingAccountextendsAccount{ privatedoubleoverdraftProtection; publicCheckingAccount(doublebalance) { super(balance); } publicCheckingAccount(doublebalance, doubleprotect) { super(balance); this.overdraftProtection=protect; } /*** 此方法必须执行下列检查。如 果当前余额足够弥补取款 amount,则正常进行。* 如果不够弥补但是存在透支保护,则尝试用 overdraftProtection 得值来弥补该差值(balance-amount).* 如果弥补该透支所需要的金额大于当前的保护级别。则整个交易失败,但余额未受影响。* @param amt 提款数目* @return 返回true代表交易成功,否则交易失败*/publicbooleanwithdraw(doubleamt){ if (balance<amt){ if (amt-balance>overdraftProtection) { returnfalse; }else { overdraftProtection-=amt-balance; balance=0; returntrue; } }else { balance-=amt; returntrue; } } }
【SavingsAccount.java】类
packagebanking; publicclassSavingsAccountextendsAccount{ privatedoubleinterestRate; publicSavingsAccount(doublebalance, doubleinterest_Rate) { super(balance); this.interestRate=interest_Rate; } }
【TestBanking.java】类
packagebanking;/** This class creates the program to test the banking classes.* It creates a set of customers, with a few accounts each,* and generates a report of current account balances.*/importbanking.*; importjava.text.NumberFormat; publicclassTestBanking { publicstaticvoidmain(String[] args) { NumberFormatcurrency_format=NumberFormat.getCurrencyInstance(); Bankbank=newBank(); Customercustomer; // Create several customers and their accountsbank.addCustomer("Jane", "Simms"); customer=bank.getCustomer(0); customer.addAccount(newSavingsAccount(500.00, 0.05)); customer.addAccount(newCheckingAccount(200.00, 400.00)); bank.addCustomer("Owen", "Bryant"); customer=bank.getCustomer(1); customer.addAccount(newCheckingAccount(200.00)); bank.addCustomer("Tim", "Soley"); customer=bank.getCustomer(2); customer.addAccount(newSavingsAccount(1500.00, 0.05)); customer.addAccount(newCheckingAccount(200.00)); bank.addCustomer("Maria", "Soley"); customer=bank.getCustomer(3); // Maria and Tim have a shared checking accountcustomer.addAccount(bank.getCustomer(2).getAccount(1)); customer.addAccount(newSavingsAccount(150.00, 0.05)); // Generate a reportSystem.out.println("\t\t\tCUSTOMERS REPORT"); System.out.println("\t\t\t================"); for (intcust_idx=0; cust_idx<bank.getNumOfCustomers(); cust_idx++) { customer=bank.getCustomer(cust_idx); System.out.println(); System.out.println("Customer: "+customer.getLastName() +", "+customer.getFirstName()); for (intacct_idx=0; acct_idx<customer.getNumOfAccounts(); acct_idx++) { Accountaccount=customer.getAccount(acct_idx); Stringaccount_type=""; // Determine the account type/*** Step 1:**** Use the instanceof operator to test what type of account**** we have and set account_type to an appropriate value, such**** as "Savings Account" or "Checking Account".***/if(accountinstanceofSavingsAccount){ account_type="Savings Account"; }else{ account_type="Checking Account"; } // Print the current balance of the account/*** Step 2:**** Print out the type of account and the balance.**** Feel free to use the currency_format formatter**** to generate a "currency string" for the balance.***/System.out.println("\t"+account_type+": current balance is ¥"+account.getBalance()); } } } }