内容要求:
一、实验目的
(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("两对象不相等");
}
}