内容要求:

一、实验目的

(1)理解对象和类,掌握用类创建对象模型。

(2)理解和掌握抽象类的使用

(3)理解和掌握继承、方法覆盖的使用

(4)初步掌握使用多态性的方法

二、实验内容

按照如下步骤完成实验:

步骤1:定义一个名为Account的抽象类代表一个银行账户类。要求如下:

(1) 放在bank包中;

(2) 数据域包括:id(String类型,代表账号)、name(String类型,代表姓名)、balance(double类型,代表账户中的余额)

(3) 对数据域进行合理的封装。通常银行开户后账号不能修改,存款余额只能通过存款和取款方法修改。

(4) 编写合理有参构造方法,使用参数对数据域进行初始化。

(5) 编写名为deposit的方法,实现存款操作。

参数:double amount,存款金额

返回类型:void

功能:增加余额

(6) 编写名为withdraw的抽象方法,定义取款操作。

参数:double amount,取款金额

返回类型:boolean,表示取款操作是否成功

(7) 覆盖toString方法,返回值形式为:[账号,姓名,余额],余额保留2位小数。

(8) 覆盖equals()方法,判断两个账户对象相等的依据是两个对象的账号是相同。

(9) 覆盖hashcode()方法,根据账户对象的账号来定义一个哈希函数。

步骤2:定义一个名为CreditAccount的类代表一个信用卡账户类,继承Account类 ,要求如下:

(1) 放在bank包中;

(2) 数据域包括:limit(double类型,透支额度),表示可以透支的金额,说明:透支是指可以在余额为0的情况下继续取款,欠款不超过透支额度即可。例如透支额度是1000元,则余额最多可以是-1000元;

(3) 对数据域进行合理的封装。

(4) 编写合理的构造方法。

(5) 覆盖withdraw的方法,实现取款操作。

参数:double amount,取款金额

返回类型:boolean,表示取款操作是否成功,取款金额超过透支额度时不能取款并返回false。即余额不能低于 (-1*信用额度)。

功能:判断是否可以取款及减少余额

步骤3:定义一个名为SavingAccount的类代表一个储蓄账户类,继承Account类 ,要求如下:

(1) 放在bank包中;

(2) 编写合理的构造方法。

(3) 覆盖withdraw的方法,实现取款操作。

参数:double amount,取款金额

返回类型:boolean,表示取款操作是否成功,取款金额超过余额时不能取款并返回false。

功能:判断是否可以取款及减少余额

步骤4:编写主类Main,放在main包中,在main方法进行如下工作:

(1) 创建1个CreditAccount对象,输出账户信息;然后进行几次存取款操作。每次操作后,输出账户信息。注意要测试取款成功或失败的情况。

(2) 创建1个SavingAccount对象,输出账户信息;然后进行几次存取款操作。每次操作后,输出账户信息。注意要测试取款成功或失败的情况。

(3) 创建2个账号相同的SavingAccount对象,输出这2个对象,判断这2个对象是否相等。

(4) 创建2个账号相同的CreditAccount对象,输出这2个对象,判断这2个对象是否相等。

(5) 创建1个SavingAccount对象和1个CreditAccount对象,输出这2个对象,判断这2个对象是否相等。

代码示例如下:

package bank;

import java.util.Objects;

//Account的抽象类代表一个银行账户类
public abstract class Account {
    private String id;//id(String类型,代表账号)
    private String name;//name(String类型,代表姓名)
    private double balance;//balance(double类型,代表账户中的余额)

    //有参构造方法
    public Account(String id, String name) {
        this.id = id;
        this.name = name;
        this.balance = 0.0;
    }

    /*deposit的方法,实现存款操作。
    参数:double amount,存款金额
    返回类型:void
    功能:增加余额*/
    public void deposit(double amount){
        this.balance+=amount;
    }

    /*withdraw的抽象方法,定义取款操作。
    参数:double amount,取款金额
    返回类型:boolean,表示取款操作是否成功*/
    abstract public boolean withdraw(double amount);

    //以下封装(银行开户后账号不能修改,存款余额只能通过存款和取款方法修改)
    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getBalance() {
        return balance;
    }

    //覆盖toString方法,返回值形式为:[账号,姓名,余额],余额保留2位小数
    @Override
    public String toString(){
        return "["+id+","+name+","+String.format("%.2f",balance)+"]";
    }

    //覆盖equals()方法,判断两个账户对象相等的依据是两个对象的账号是相同。
    @Override
    public boolean equals(Object O){
        if (O == null)return false;
        if (this.getClass()!=O.getClass())return false;
        Account Ac = (Account) O;
        if(Ac.name.equals(this.name))return false;
        return true;
    }

    //覆盖hashcode()方法,根据账户对象的账号来定义一个哈希函数。
    @Override
    public int hashCode(){
        return Objects.hash(id);
    }
}
package bank;
/*步骤3:定义一个名为 ,要求如下:
        (1) 放在bank包中;
        (2) 编写合理的构造方法。
        (3) 覆盖withdraw的方法,实现取款操作。
        参数:double amount,取款金额
        返回类型:boolean,表示取款操作是否成功,取款金额超过余额时不能取款并返回false。
        功能:判断是否可以取款及减少余额*/

//SavingAccount的类代表一个储蓄账户类,继承Account类
public class SavingAccount extends Account{

    public SavingAccount(String id, String name) {
        super(id, name);
    }

    @Override
    public boolean withdraw(double amount) {
        if(super.getBalance()<amount) return false;
        else{
            super.deposit(-amount);
            return true;
        }
    }
}
package bank;

//CreditAccount的类代表一个信用卡账户类,继承Account类
public class CreditAccount extends Account{
    private double limit;//limit(double类型,透支额度)

    //有参构造方法
    public CreditAccount(String id, String name, double limit) {
        super(id, name);
        this.limit = limit;
    }

    //以下封装
    public double getLimit() {
        return limit;
    }

    public void setLimit(double limit) {
        this.limit = limit;
    }

    //覆盖withdraw的方法,实现取款操作。
    @Override
    public boolean withdraw(double amount){
        if (super.getBalance()+limit<amount)return false;
        else {
            deposit(-amount);
            return true;
        }
    }
}
package main;

import bank.CreditAccount;
import bank.SavingAccount;

import java.util.Calendar;

public class Main {
    public static void main(String[] args) {

        //(1) 创建1个CreditAccount对象,输出账户信息;然后进行几次存取款操作。每次操作后,输出账户信息。注意要测试取款成功或失败的情况。
        CreditAccount ca=new CreditAccount("ca123456","zhangsan",1000);
        System.out.println(ca.toString());
        ca.deposit(100);
        System.out.println(ca.toString());
        ca.withdraw(200);
        System.out.println(ca.toString());
        ca.withdraw(1000);
        System.out.println(ca.toString());
        System.out.println();

        //(2) 创建1个SavingAccount对象,输出账户信息;然后进行几次存取款操作。每次操作后,输出账户信息。注意要测试取款成功或失败的情况。
        SavingAccount sa=new SavingAccount("sa123456","lisi");
        System.out.println(sa.toString());
        sa.deposit(100);
        System.out.println(sa.toString());
        sa.withdraw(1000);
        System.out.println(sa.toString());
        sa.withdraw(10);
        System.out.println(sa.toString());
        System.out.println();

        //(3) 创建2个账号相同的SavingAccount对象,输出这2个对象,判断这2个对象是否相等。
        SavingAccount sa1=new SavingAccount("sa666666","zhangsan");
        SavingAccount sa2=new SavingAccount("sa666666","lisi");
        System.out.println(sa1.toString());
        System.out.println(sa2.toString());
        if(sa1.equals(sa2))System.out.println("两对象相等");
        else System.out.println("两对象不相等");
        System.out.println();

        //(4) 创建2个账号相同的CreditAccount对象,输出这2个对象,判断这2个对象是否相等。
        CreditAccount ca1=new CreditAccount("ca666666","zhangsan",1000);
        CreditAccount ca2=new CreditAccount("ca666666","lisi",2000);
        System.out.println(ca1.toString());
        System.out.println(ca2.toString());
        if(ca1.equals(ca2))System.out.println("两对象相等");
        else System.out.println("两对象不相等");
        System.out.println();

        //(5) 创建1个SavingAccount对象和1个CreditAccount对象,输出这2个对象,判断这2个对象是否相等。
        SavingAccount sa3=new SavingAccount("sa888888","zhangsan");
        CreditAccount ca3=new CreditAccount("ca888888","lisi",1000);
        System.out.println(sa3.toString());
        System.out.println(ca3.toString());
        if(sa3.equals(ca3))System.out.println("两对象相等");
        else System.out.println("两对象不相等");
    }
}