题目类别: B实验
关键字: 类的定义 抽象类 继承 方法覆盖 多态
内容要求:
一、实验目的
(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个对象是否相等。
提交:打包为可以执行的JAR文档,其中要包含源程序文件。
Main类:
package main;
import bank.CreditAccount;
import bank.SavingAccount;
import java.security.spec.RSAOtherPrimeInfo;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
double temp;
System.out.println("请输入信用卡账户id:");
String id=sc.next();
System.out.println("请输入账户姓名:");
String name=sc.next();
System.out.println("请输入信用额度:");
double limit=sc.nextDouble();
CreditAccount a=new CreditAccount(id,name,limit);
System.out.println("请输入存入金额:");
temp=sc.nextDouble();
a.deposit(temp);
System.out.println("成功存入"+temp+"元");
System.out.println("请输入取出金额:");
temp=sc.nextDouble();
if(a.withdraw(temp)){
System.out.println("成功取出"+temp+"元");
System.out.println("账户信息为:");
System.out.println(a.toString());
}
else {
System.out.println("余额与信用不足");
}
System.out.println("请输入取出金额:");
temp=sc.nextDouble();
if(a.withdraw(temp)){
System.out.println("成功取出"+temp+"元");
System.out.println("账户信息为:");
System.out.println(a.toString());
}
else {
System.out.println("余额与信用不足");
}
System.out.println("----------------");
System.out.println("请输入储蓄卡账户id:");
id=sc.next();
System.out.println("请输入账户姓名:");
name=sc.next();
SavingAccount sa=new SavingAccount(id,name);
System.out.println("请输入存入金额:");
temp=sc.nextDouble();
sa.deposit(temp);
System.out.println("成功存入"+temp+"元");
System.out.println("请输入取出金额:");
temp=sc.nextDouble();
if(sa.withdraw(temp)){
System.out.println("成功取出"+temp+"元");
System.out.println("账户信息为:");
System.out.println(sa.toString());
}
else {
System.out.println("余额不足");
}
System.out.println("请输入取出金额:");
temp=sc.nextDouble();
if(sa.withdraw(temp)){
System.out.println("成功取出"+temp+"元");
System.out.println("账户信息为:");
System.out.println(sa.toString());
}
else {
System.out.println("余额不足");
}
System.out.println("----------------");
System.out.println("将创建两个id都为2022,名字分别为Lucy和Amy的储蓄卡账户");
SavingAccount sa1=new SavingAccount("2022","Lucy");
SavingAccount sa2=new SavingAccount("2022","Amy");
if(sa1.equals(sa2)){
System.out.println("两个账户相同");
}
else System.out.println("两个账户不相同");
System.out.println("-----------------");
System.out.println("将创建两个id都为666,名字分别为ZYX和YSK,信用为100的信用卡账号,");
CreditAccount a1=new CreditAccount("666","ZYX",100);
CreditAccount a2=new CreditAccount("666","YSK",100);
if(a1.equals(a2)){
System.out.println("两个账户相同");
}
else System.out.println("两个账户不相同");
System.out.println("------------------");
System.out.println("将创建一个信用卡账户和一个储蓄卡账户");
System.out.println("请分别输入信用卡账户信息(id,name,limit):");
CreditAccount a3=new CreditAccount(sc.next(), sc.next(), sc.nextDouble());
System.out.println("请分别输入储蓄卡账户信息(id,name):");
SavingAccount sa3=new SavingAccount(sc.next(), sc.next());
if(a3.equals(sa3)){
System.out.println("两个账号相同");
}
else System.out.println("两个账号不相同");
}
}
Account类:
package bank;
import java.util.Objects;
public abstract class Account {
private String id;
private String name;
private double balance;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
public Account(String id,String name) {
this.id = id;
this.name = name;
balance = 0.0;
}
public void deposit(double amount){
this.balance+=amount;
}
abstract public boolean withdraw(double amount);
@Override
public String toString() {
return "["+this.id+","+this.name+","+String.format("%.2f",this.balance)+"]";
}
@Override
public boolean equals(Object obj) {
Account ac=(Account) obj;
if(ac.id.equals(this.id))
return true;
return false;
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
CreditAccount类:
package bank;
public class CreditAccount extends Account{
private double limit;
public double getLimit() {
return limit;
}
public void setLimit(double limit) {
this.limit = limit;
}
public CreditAccount(String id, String name,double limit) {
super(id, name);
this.limit=limit;
}
@Override
public boolean withdraw(double amount) {
if(amount>limit+getBalance())
return false;
if(amount<=limit+getBalance()){
setBalance(getBalance()-amount);
return true;
}
return false;
}
}
SavingAccoun类:
package bank;
public class SavingAccount extends Account{
public SavingAccount(String id, String name) {
super(id, name);
}
@Override
public boolean withdraw(double amount) {
if (amount<=getBalance()){
setBalance(getBalance()-amount);
return true;
}
return false;
}
}