ATM机案例2之多态的实现
ATM机案例2之多态的实现
多态就是在统一继承树上的不同对象针对同一行为的不同表现。(exdents继承或者implements实现是多态性的前提。)
格式:
父类名称 对象名=new 子类名称();
接口名称 对象名=new 实现类名称();
Account(账户类)
属性:卡号、名称、余额
行为:查询个人信息、设置余额、增加余额、减少余额(转账、存款、取款都依靠余额的增加和减少实现)
点击查看代码
public class Account{
//定义私有变量,同时需要创建get、set方法供外部类调用
private int card_id;
private String name;
private float balance;
private String bankname;
//查询信息
public void queryInfo() {
System.out.printf("卡号:%d\t名字:%s\t余额:%f\t银行:%s\r\n", card_id, name, balance,bankname);
}
public int getCard_id() {
return card_id;
}
//余额增加
public void inputMoney(float money) {
balance += money;
}
//余额减少,余额减少时需要判断余额是否足够
public void outputMoney(float money) {
if (money > balance) {
System.out.println("您的余额不足!");
} else {
balance -= money;
}
}
public void setCard_id(int card_id) {
this.card_id = card_id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getBalance() {
return balance;
}
public void setBalance(float balance) {
this.balance = balance;
}
public String getBankname() {
return bankname;
}
public void setBankname(String bankname) {
this.bankname = bankname;
}
}
Bank(银行类)
属性:账户
行为:开户、转账、查询所有账户
点击查看代码
public class Bank{
static Account[] accounts = new Account[10];
static int count = 0;
//开户方法
public void createAccount(int card_id, String name, float balance) {
if (findById(card_id) == null) {
Account account = new Account();
account.setCard_id(card_id);
account.setName(name);
account.setBalance(balance);
Scanner scanner = new Scanner(System.in);
System.out.println("请选择您开户的银行:\n1、中国工商银行\t2、中国招商银行\t3、中国人民银行\r");
int choose = scanner.nextInt();
switch (choose) {
case 1:
account.setBankname("中国工商银行");
break;
case 2:
account.setBankname("中国招商银行");
break;
case 3:
account.setBankname("中国人民银行");
break;
default:
System.out.println("非法输入!");
break;
}
accounts[count] = account;
count++;
} else {
System.out.println("该卡号已被创建!");
}
}
//转账方法,根据具体的不同银行,调用不同的转账方法
public void transfer(int fromId, int toId, float money) {
Account from = findById(fromId);
Account to = findById(toId);
switch (from.getBankname()) {
case "中国工商银行":
Bank icbcBank = new ICBCBank();
icbcBank.transfer(fromId, toId, money);
break;
case "中国招商银行":
Bank cmbBank = new CMBBank();
cmbBank.transfer(fromId, toId, money);
break;
case "中国人民银行":
Bank pbcBank = new PBCBank();
pbcBank.transfer(fromId, toId, money);
break;
}
}
//查询方法,展示所有账户信息
public void show() {
if (accounts[0] == null) {
System.out.println("暂无账号记录!");
} else {
for (int i = 0; i < count; i++) {
Account account = accounts[i];
account.queryInfo();
}
}
}
public Account findById(int Id) {
for (int i = 0; i <count; i++) {
Account account = accounts[i];
if (Id == account.getCard_id()) {
return account;
}
}
return null;
}
}
ATM(ATM机类)
属性:银行
行为:接收用户输入
点击查看代码
public class ATM{
//实例化一个银行对象
Bank bank = new Bank();
//调用菜单方法
public static void main(String[] args) {
ATM atm = new ATM();
atm.displayMenu();
}
//菜单方法
private void displayMenu() {
while (true) {
System.out.println("1.开户\t2.转账\t3.查询\t0.退出");
int choose = 0;
Scanner scanner = new Scanner(System.in);
try {
choose = scanner.nextInt();
if (choose == 0) {
System.out.println("已退出!");
scanner.close();
break;
}
switch (choose) {
case 1:
System.out.println("请依次输入卡号、姓名、余额:");
bank.createAccount(scanner.nextInt(), scanner.next(), scanner.nextFloat());
break;
case 2:
System.out.println("请依次输入汇款卡号、收款卡号、转账金额:");
//调用银行的转账方法
bank.transfer(scanner.nextInt(), scanner.nextInt(), scanner.nextFloat());
break;
case 3:
bank.show();
break;
default:
System.out.println("非法输入!");
break;
}
} catch (Exception e) {
if (e instanceof NullPointerException) {
System.out.println("存在非法卡号!");
} else {
System.out.println("非法输入!");
}
}
}
}
}
具体银行类
CMBBank(招商银行类)
public class CMBBank extends Bank {
//招商银行 不收手续费
//重写父类(银行类)的转账方法
@Override
public void transfer(int fromId, int toId, float money) {
Account from = super.findById(fromId);
Account to = super.findById(toId);
if (money > from.getBalance()) {
System.out.println("余额不足,转账失败");
} else {
from.outputMoney(money);
to.inputMoney(money);
System.out.printf("汇款账户余额:%f\t收款账户余额:%f\t收取手续费:%f\r\n",
from.getBalance(),to.getBalance(),0.0);
}
}
}
ICBCBank(工商银行类)
public class ICBCBank extends Bank {
//中国工商银行 转账收手续费2元每次
//重写父类(银行类)的转账方法
@Override
public void transfer(int fromId, int toId, float money) {
Account from = super.findById(fromId);
from.queryInfo();
Account to = super.findById(toId);
to.queryInfo();
if (money + 2 > from.getBalance()) {
System.out.println("余额不足,转账失败");
} else {
from.outputMoney(money + 2);
to.inputMoney(money);
System.out.printf("汇款账户余额:%f\t收款账户余额:%f\t收取手续费:%f\r\n",
from.getBalance(), to.getBalance(), 2.0);
}
}
}
PBCBank(人民银行类)
public class PBCBank extends Bank {
//中国人民银行 收取手续费为转账金额1%
//重写父类(银行类)的转账方法
@Override
public void transfer(int fromId, int toId, float money) {
Account from = super.findById(fromId);
Account to = super.findById(toId);
if ((money/100+money) > from.getBalance()) {
System.out.println("余额不足,转账失败");
} else {
from.outputMoney(money/100+money);
to.inputMoney(money);
System.out.printf("汇款账户余额:%f\t收款账户余额:%f\t收取手续费:%f\r\n",
from.getBalance(),to.getBalance(),money/100);
}
}
}

浙公网安备 33010602011771号