Java 基础—Bank 项目—实验 5

109 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情

实验题目

在银行项目中创建 Account 的两个子类:SavingsAccount 和 CheckingAccount

实验目的

继承、多态、方法的重写。

提 示

尚硅谷_Java基础实战_Bank项目_05_关系图

尚硅谷_Java基础实战_Bank项目_05_UML

创建 Account 类的两个子类:SavingsAccount 和 CheckingAccount 子类。

  1. 修改 Account 类;将 balance 属性的访问方式改为 protected。
  2. 创建 SavingsAccount 类,该类继承 Account 类。
  3. 该类必须包含一个类型为 double 的 interestRate 属性。
  4. 该类必须包括带有两个参数(balance 和 interest_rate)的公有构造器。该 构 造器必须通过调用 super(balance)将 balance 参数传递给父类构造器。

实现 CheckingAccount 类。

  1. CheckingAccount 类必须扩展 Account 类。

  2. 该类必须包含一个类型为 double 的 overdraftProtection 属性。

  3. 该类必须包含一个带有参数(balance)的共有构造器。该构造器必须通过调 用 super(balance)将 balance 参数传递给父类构造器。

  4. 给类必须包括另一个带有两个参数(balance 和 protect)的公有构造器。该 构造器必须通过调用 super(balance)并设置 overdragtProtection 属性, 将 balance 参数传递给父类构造器。

  5. CheckingAccount 类必须覆盖 withdraw 方法。此方法必须执行下列检 查。如 果当前余额足够弥补取款 amount,则正常进行。如果不够弥补但是 存在透支 保护,则尝试用 overdraftProtection 得值来弥补该差值 (balance-amount). 如果弥补该透支所需要的金额大于当前的保护级别。 则整个交易失败,但余 额未受影响。

  6. 在主 exercise1 目录中,编译并执行 TestBanking 程序。输出应为:

    Creating the customer Jane Smith.
    Creating her Savings Account with a 500.00 balance and 3% interest.
    Creating the customer Owen Bryant.
    Creating his Checking Account with a 500.00 balance and no overdraft protection.
    Creating the customer Tim Soley.
    Creating his Checking Account with a 500.00 balance and 500.00 in overdraft protection.
    Creating the customer Maria Soley.
    Maria shares her Checking Account with her husband Tim.
    
    Retrieving the customer Jane Smith with her savings account.
    Withdraw 150.00: true
    Deposit 22.50: true
    Withdraw 47.62: true
    Withdraw 400.00: false
    Customer [Simms, Jane] has a balance of 324.88
    
    Retrieving the customer Owen Bryant with his checking account with no overdraft protection.
    Withdraw 150.00: true
    Deposit 22.50: true
    Withdraw 47.62: true
    Withdraw 400.00: false
    Customer [Bryant, Owen] has a balance of 324.88
    
    Retrieving the customer Tim Soley with his checking account that has overdraft protection.
    Withdraw 150.00: true
    Deposit 22.50: true
    Withdraw 47.62: true
    Withdraw 400.00: true
    Customer [Soley, Tim] has a balance of 0.0
    
    Retrieving the customer Maria Soley with her joint checking account with husband Tim.
    Deposit 150.00: true
    Withdraw 750.00: false
    Customer [Soley, Maria] has a balance of 150.0
    

代码

【Account.java】类

package banking;

public class Account {

    protected double balance;    //银行帐户的当前(或即时)余额

    //公有构造器 ,这个参数为 balance 属性赋值
    public Account(double init_balance) {
        this.balance = init_balance;
    }

    //用于获取经常余额
    public double getBalance() {
        return balance;
    }

    /**
     * 向当前余额增加金额
     * @param amt   增加金额
     * @return  返回 true(意味所有存款是成功的)
     */
    public boolean deposit(double amt){
        balance+=amt;
        return true;
    }

    /**
     * 从当前余额中减去金额
     * @param amt   提款数目
     * @return  如果 amt小于 balance, 则从余额中扣除提款数目并返回 true,否则余额不变返回 false。
     */
    public boolean withdraw(double amt){
        if (amt < balance){
            balance-=amt;
            return true;
        }else{
            return false;
        }

    }

}

【Customer.java】类

package banking;

public class Customer {

    private String  firstName;
    private String  lastName;
    private Account account;

    public Customer(String f, String l) {
        this.firstName = f;
        this.lastName = l;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public Account getAccount() {
        return account;
    }

    public void setAccount(Account acct) {
        this.account = acct;
    }

}

【Bank.java】类

package banking;

/**
 * 银行类
 */
public class Bank {

    private Customer[] customers;   //Customer对象的数组
    private int numberOfCustomer;   //整数,跟踪下一个 customers 数组索引

    /**
     * 公有构造器,以合适的最大尺寸(至少大于 5)初始化 customers 数组。
     */
    public Bank() {
        customers = new Customer[10];
    }

    /**
     *  该方法必须依照参数(姓,名)构造一个新的 Customer 对象然后把它放到 customer 数组中。还必须把 numberOfCustomers 属性的值加 1。
     * @param f 姓
     * @param l 名
     */
    public void addCustomer(String f,String l){
        customers[numberOfCustomer++]=new Customer(f,l);
    }

    /**
     * 通过下标索引获取 customer
     * @param index 下标索引
     * @return  customer
     */
    public Customer getCustomer(int index) {
        return customers[index];
    }

    public int getNumOfCustomers() {
        return numberOfCustomer;
    }
}

【CheckingAccount.java】类

package banking;

public class CheckingAccount extends Account{

    private double overdraftProtection;

    public CheckingAccount(double balance) {
        super(balance);
    }

    public CheckingAccount(double balance, double protect) {
        super(balance);
        this.overdraftProtection = protect;
    }

    /**
     * 此方法必须执行下列检查。如 果当前余额足够弥补取款 amount,则正常进行。
     * 如果不够弥补但是存在透支保护,则尝试用 overdraftProtection 得值来弥补该差值(balance-amount).
     * 如果弥补该透支所需要的金额大于当前的保护级别。则整个交易失败,但余额未受影响。
     * @param amt   提款数目
     * @return  返回true代表交易成功,否则交易失败
     */
    @Override
    public boolean withdraw(double amt){
        if (balance < amt){
            if (amt-balance>overdraftProtection) {
                return false;
            }else {
                overdraftProtection-=amt-balance;
                balance=0;
                return true;
            }
        }else {
            balance-=amt;
            return true;
        }
    }
}

【SavingsAccount.java】类

package banking;

public class SavingsAccount extends Account{

    private double interestRate;

    public SavingsAccount(double balance, double interest_Rate) {
        super(balance);
        this.interestRate = interest_Rate;
    }
}

【TestBanking.java】类

package banking;/*
 * This class creates the program to test the banking classes.
 * It creates a new Bank, sets the Customer (with an initial balance),
 * and performs a series of transactions with the Account object.
 */

import banking.*;

public class TestBanking {

  public static void main(String[] args) {
    Bank bank = new Bank();
    Customer customer;
    Account account;

    //
    // Create bank customers and their accounts
    //

    System.out.println("Creating the customer Jane Smith.");
    bank.addCustomer("Jane", "Simms");
    //code
    System.out.println("Creating her Savings Account with a 500.00 balance and 3% interest.");
    //code
    bank.getCustomer(0).setAccount(new SavingsAccount(500.00,0.03));

    System.out.println("Creating the customer Owen Bryant.");
    //code
    bank.addCustomer("Owen", "Bryant");

    customer = bank.getCustomer(1);
    System.out.println("Creating his Checking Account with a 500.00 balance and no overdraft protection.");
    //code
    customer.setAccount(new CheckingAccount(500.00,0));

    System.out.println("Creating the customer Tim Soley.");
    bank.addCustomer("Tim", "Soley");
    customer = bank.getCustomer(2);
    System.out.println("Creating his Checking Account with a 500.00 balance and 500.00 in overdraft protection.");
    //code
    customer.setAccount(new CheckingAccount(500.00,500.00));

    System.out.println("Creating the customer Maria Soley.");
    //code
    bank.addCustomer("Maria", "Soley");

    customer = bank.getCustomer(3);
    System.out.println("Maria shares her Checking Account with her husband Tim.");
    customer.setAccount(bank.getCustomer(2).getAccount());
    System.out.println();

    //
    // Demonstrate behavior of various account types
    //

    // Test a standard Savings Account
    System.out.println("Retrieving the customer Jane Smith with her savings account.");
    customer = bank.getCustomer(0);
    account = customer.getAccount();
    // Perform some account transactions
    System.out.println("Withdraw 150.00: " + account.withdraw(150.00));
    System.out.println("Deposit 22.50: " + account.deposit(22.50));
    System.out.println("Withdraw 47.62: " + account.withdraw(47.62));
    System.out.println("Withdraw 400.00: " + account.withdraw(400.00));
    // Print out the final account balance
    System.out.println("Customer [" + customer.getLastName()
		       + ", " + customer.getFirstName()
		       + "] has a balance of " + account.getBalance());

    System.out.println();

    // Test a Checking Account w/o overdraft protection
    System.out.println("Retrieving the customer Owen Bryant with his checking account with no overdraft protection.");
    customer = bank.getCustomer(1);
    account = customer.getAccount();
    // Perform some account transactions
    System.out.println("Withdraw 150.00: " + account.withdraw(150.00));
    System.out.println("Deposit 22.50: " + account.deposit(22.50));
    System.out.println("Withdraw 47.62: " + account.withdraw(47.62));
    System.out.println("Withdraw 400.00: " + account.withdraw(400.00));
    // Print out the final account balance
    System.out.println("Customer [" + customer.getLastName()
		       + ", " + customer.getFirstName()
		       + "] has a balance of " + account.getBalance());

    System.out.println();

    // Test a Checking Account with overdraft protection
    System.out.println("Retrieving the customer Tim Soley with his checking account that has overdraft protection.");
    customer = bank.getCustomer(2);
    account = customer.getAccount();
    // Perform some account transactions
    System.out.println("Withdraw 150.00: " + account.withdraw(150.00));
    System.out.println("Deposit 22.50: " + account.deposit(22.50));
    System.out.println("Withdraw 47.62: " + account.withdraw(47.62));
    System.out.println("Withdraw 400.00: " + account.withdraw(400.00));
    // Print out the final account balance
    System.out.println("Customer [" + customer.getLastName()
		       + ", " + customer.getFirstName()
		       + "] has a balance of " + account.getBalance());

    System.out.println();

    // Test a Checking Account with overdraft protection
    System.out.println("Retrieving the customer Maria Soley with her joint checking account with husband Tim.");
    customer = bank.getCustomer(3);
    account = customer.getAccount();
    // Perform some account transactions
    System.out.println("Deposit 150.00: " + account.deposit(150.00));
    System.out.println("Withdraw 750.00: " + account.withdraw(750.00));
    // Print out the final account balance
    System.out.println("Customer [" + customer.getLastName()
		       + ", " + customer.getFirstName()
		       + "] has a balance of " + account.getBalance());

  }
}