在复习完 Java SE 的全部基础知识点后,为了更加熟练掌握 Java 面向对象的特性,进一步掌握编程技巧和调试技巧,使用 Java 模拟实现一个银行 ATM 系统软件,共 Account.java 和 ATM.java 两个 Java 类。以下为部分代码设计和实现,可供参考。
一、银行 ATM 系统技术选型分析
面向对象编程:每个用户对象要对应一个账户对象,所以需要设计账户类 Account
。
使用集合容器:系统需要提供一个容器用于存储这些账户对象的信息,选用 ArrayList
集合。
程序流程控制:需要结合分支、循环、跳转等相关操作控制程序的业务逻辑。
使用常见API:内容比较,分析,数据处理等需要用到 String
等常用 API。
二、Account 账户类设计
每个用户一个账户对象,需要设计账户类 Account
,账户类至少包含(卡号、用户名、余额、取现额度、密码)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| public class Account { private String cardId; private String userName; private String passWord; private double money; private double quotaMoney;
public String getCardId() { return cardId; }
public void setCardId(String cardId) { this.cardId = cardId; }
public String getUserName() { return userName; }
public void setUserName(String userName) { this.userName = userName; }
public String getPassWord() { return passWord; }
public void setPassWord(String passWord) { this.passWord = passWord; }
public double getMoney() { return money; }
public void setMoney(double money) { this.money = money; }
public double getQuotaMoney() { return quotaMoney; }
public void setQuotaMoney(double quotaMoney) { this.quotaMoney = quotaMoney; } }
|
三、首页设计
需要定义一个 ArrayList
的集合用于存储账户对象。
1
| ArrayList accounts = new ArrayList<>();
|
需要展示欢迎页包含2个功能:注册开户、登录账户。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| public static void main(String[] args) { ArrayList<Account> accounts = new ArrayList<>();
System.out.println("======欢迎您进入到黑马ATM系统==============="); while (true) { System.out.println("1、登录账户"); System.out.println("2、注册账户"); System.out.println("请您选择操作:"); Scanner sc = new Scanner(System.in); int command = sc.nextInt(); switch (command){ case 1: login(accounts, sc); break; case 2: register(accounts, sc); break; default: System.out.println("当前输入的操作不存在!"); } } }
|
四、用户开户功能实现
开户功能应该独立定义成方法,并传入当前集合对象给该方法。
1
| public static void register(ArrayList<Account> accounts) {…}
|
需要提示用户输入个人信息,开户的卡号是系统自动生成的8位数。
1
| public static String createCardId(){…}
|
注意自动生成的卡号不能与其他用户的卡号重复。
最终把用户开户的信息封装成 Account
对象,存入到集合中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
private static void register(ArrayList<Account> accounts, Scanner sc) { System.out.println("==================欢迎您进入到开户操作======================"); Account acc = new Account(); System.out.println("请您输入账户名称:"); String userName =sc.next(); acc.setUserName(userName);
while (true) { System.out.println("请您输入账户密码:"); String passWord =sc.next(); System.out.println("请您输入确认密码:"); String okPassWord =sc.next(); if(okPassWord.equals(passWord)){ acc.setPassWord(okPassWord); break; }else { System.out.println("两次输入的密码不一致!"); } } System.out.println("请您设置当次取现额度:"); double quataMoney = sc.nextDouble(); acc.setQuotaMoney(quataMoney); String cardId = createCardId(accounts); acc.setCardId(cardId);
accounts.add(acc); System.out.println("恭喜您,"+acc.getUserName()+"先生/女士,您开户完成,您的卡号是:" + acc.getCardId()); }
public static String createCardId(ArrayList<Account> accounts){ while (true) { String cardId = ""; Random r = new Random(); for (int i = 1; i <= 8 ; i++) { cardId += r.nextInt(10); } Account account = getAccountByCardId(cardId , accounts); if(account == null){ return cardId; } } }
public static Account getAccountByCardId(String cardId , ArrayList<Account> accounts){ for (int i = 0; i < accounts.size(); i++) { Account acc = accounts.get(i); if(acc.getCardId().equals(cardId)){ return acc; } } return null; } }
|
五、用户登录功能和界面实现
定义方法:
1
| public static void login(ArrayList<Account> accounts) {…}
|
需要根据卡号去集合中查询对应的账户对象。如果找到了账户对象,说明卡号存在,继续输入密码。如果密码也正确,则登录成功。
用户登录成功后,需要进入用户操作页。查询就是直接展示当前登录成功的账户对象的信息。退出账户是需要回到首页的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
private static void login(ArrayList<Account> accounts, Scanner sc) { System.out.println("==================欢迎您进入到登录操作======================"); if(accounts.size() > 0){ while (true) { System.out.println("请您输入登录的卡号:"); String cardId = sc.next(); Account acc = getAccountByCardId(cardId , accounts); if(acc != null){ while (true) { System.out.println("请您输入登录的密码:"); String passWord = sc.next(); if(acc.getPassWord().equals(passWord)){ System.out.println("欢迎你:" + acc.getUserName() + "先生/女士进入系统,您可开始办理你的业务了!"); showCommand(sc, acc, accounts); return; }else { System.out.println("您的密码不正确!"); } } }else { System.out.println("卡号不存在,请确认!"); } } }else { System.out.println("当前系统无任何账户,请先注册再登录!"); } }
private static void showCommand(Scanner sc, Account acc, ArrayList<Account> accounts) { while (true) { System.out.println("==================欢迎您进入到操作界面======================"); System.out.println("1、查询"); System.out.println("2、存款"); System.out.println("3、取款"); System.out.println("4、转账"); System.out.println("5、修改密码"); System.out.println("6、退出"); System.out.println("7、注销账户"); System.out.println("请您输入操作命令:"); int command = sc.nextInt(); switch (command) { case 1: showAccount(acc); break; case 2: depositMoney(acc,sc); break; case 3: drawMoney(acc,sc); break; case 4: transferMoney(acc, accounts, sc); break; case 5: updatePassWord(acc, sc); return; case 6: System.out.println("欢迎下次继续光临!!"); return; case 7: accounts.remove(acc); System.out.println("您的账户已经完成了销毁,您将不可以进行登录了!"); return; default: System.out.println("您的操作命令有误!"); } }
}
|
六、用户转账、存款、取款功能
转账功能要分析对方账户是否存在的问题。还要分析自己的余额是否足够的问题。
存款和取款都是拿到当前用户的账户对象,通过调用账户对象的 set
方法修改其余额。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
|
private static void transferMoney(Account acc, ArrayList<Account> accounts, Scanner sc) { if(acc.getMoney() <= 0){ System.out.println("您自己都没钱,就别转了吧!"); return; }
if(accounts.size() >= 2){ while (true) { System.out.println("请您输入对方卡号:"); String cardId = sc.next();
Account otherAcc = getAccountByCardId(cardId , accounts); if(otherAcc != null){ if(acc.getCardId().equals(otherAcc.getCardId())){ System.out.println("不能给自己账户转账!"); }else { String rs = "*" + otherAcc.getUserName().substring(1); System.out.println("请您确认["+rs +"]的姓氏来确认!"); System.out.println("请您输入对方的姓氏:"); String preName = sc.next(); if(otherAcc.getUserName().startsWith(preName)){ while (true) { System.out.println("请您输入转账的金额(您最多可以转账:" + acc.getMoney() +"元):"); double money = sc.nextDouble(); if(money > acc.getMoney()){ System.out.println("你不听话,没有这么多钱可以转!"); }else { acc.setMoney(acc.getMoney() - money); otherAcc.setMoney(otherAcc.getMoney() + money); System.out.println("您已经完成转账!您当前还剩余:" + acc.getMoney()); return; } }
}else { System.out.println("您输入对方的信息有误!"); } } }else { System.out.println("您输入的转账卡号不存在!"); } } }else { System.out.println("当前系统中没有其他账户可以转账,去注册一个账户吧!"); }
}
private static void drawMoney(Account acc, Scanner sc) { System.out.println("==================欢迎进入账户取款操作======================"); double money = acc.getMoney(); if(money >= 100) { while (true) { System.out.println("请您输入取钱的金额:"); double drawMoney = sc.nextDouble(); if(drawMoney > acc.getQuotaMoney()){ System.out.println("您当前取款金额超过了每次限额!"); }else { if(drawMoney > money){ System.out.println("当前余额不足!当前余额是:" + money); }else { acc.setMoney(money - drawMoney); System.out.println("您当前取钱完成,请拿走你的钱,当前剩余余额是:" + acc.getMoney()); break; } } } }else { System.out.println("您当前账户余额不足100元,存钱去吧!"); } }
private static void depositMoney(Account acc, Scanner sc) { System.out.println("==================欢迎进入账户存款操作======================"); System.out.println("请您输入存款金额:"); double money = sc.nextDouble(); acc.setMoney(acc.getMoney() + money); showAccount(acc); }
private static void showAccount(Account acc) { System.out.println("==================您当前账户详情信息如下======================"); System.out.println("卡号:" + acc.getCardId()); System.out.println("户主:" + acc.getUserName()); System.out.println("余额:" + acc.getMoney()); System.out.println("当次取现额度:" + acc.getQuotaMoney()); }
private static void transferMoney(Account acc, ArrayList<Account> accounts, Scanner sc) { if(acc.getMoney() <= 0){ System.out.println("您自己都没钱,就别转了吧!"); return; }
if(accounts.size() >= 2){ while (true) { System.out.println("请您输入对方卡号:"); String cardId = sc.next();
Account otherAcc = getAccountByCardId(cardId , accounts); if(otherAcc != null){ if(acc.getCardId().equals(otherAcc.getCardId())){ System.out.println("不能给自己账户转账!"); }else { String rs = "*" + otherAcc.getUserName().substring(1); System.out.println("请您确认["+rs +"]的姓氏来确认!"); System.out.println("请您输入对方的姓氏:"); String preName = sc.next(); if(otherAcc.getUserName().startsWith(preName)){ while (true) { System.out.println("请您输入转账的金额(您最多可以转账:" + acc.getMoney() +"元):"); double money = sc.nextDouble(); if(money > acc.getMoney()){ System.out.println("你不听话,没有这么多钱可以转!"); }else { acc.setMoney(acc.getMoney() - money); otherAcc.setMoney(otherAcc.getMoney() + money); System.out.println("您已经完成转账!您当前还剩余:" + acc.getMoney()); return; } }
}else { System.out.println("您输入对方的信息有误!"); } } }else { System.out.println("您输入的转账卡号不存在!"); } } }else { System.out.println("当前系统中没有其他账户可以转账,去注册一个账户吧!"); }
}
private static void drawMoney(Account acc, Scanner sc) { System.out.println("==================欢迎进入账户取款操作======================"); double money = acc.getMoney(); if(money >= 100) { while (true) { System.out.println("请您输入取钱的金额:"); double drawMoney = sc.nextDouble(); if(drawMoney > acc.getQuotaMoney()){ System.out.println("您当前取款金额超过了每次限额!"); }else { if(drawMoney > money){ System.out.println("当前余额不足!当前余额是:" + money); }else { acc.setMoney(money - drawMoney); System.out.println("您当前取钱完成,请拿走你的钱,当前剩余余额是:" + acc.getMoney()); break; } } } }else { System.out.println("您当前账户余额不足100元,存钱去吧!"); } }
private static void depositMoney(Account acc, Scanner sc) { System.out.println("==================欢迎进入账户存款操作======================"); System.out.println("请您输入存款金额:"); double money = sc.nextDouble(); acc.setMoney(acc.getMoney() + money); showAccount(acc); }
private static void showAccount(Account acc) { System.out.println("==================您当前账户详情信息如下======================"); System.out.println("卡号:" + acc.getCardId()); System.out.println("户主:" + acc.getUserName()); System.out.println("余额:" + acc.getMoney()); System.out.println("当次取现额度:" + acc.getQuotaMoney()); }
|
七、用户密码修改功能、销户功能
修改密码就是把当前对象的密码属性使用 set
方法进行更新。销户是从集合对象中删除当前对象,并回到首页。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
private static void updatePassWord(Account acc, Scanner sc) { while (true) { System.out.println("请您输入当前密码认证:"); String passWord = sc.next(); if(acc.getPassWord().equals(passWord)){ while (true) { System.out.println("请您输入新密码:"); String newPassWord = sc.next(); System.out.println("请您确认新密码:"); String okPassWord = sc.next(); if(newPassWord.equals(okPassWord)){ acc.setPassWord(okPassWord); System.out.println("密码已经修改成功,请重新登录!"); return; }else { System.out.println("两次密码不一致!"); } } }else { System.out.println("您输入的密码有误。请重新确认密码!"); } } }
|