根据上面图片分析,写出演示代码如下:
账户类代码如下:
/** * 账户类 */ 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; } }
测试类方法如下:
/** * ATM系统的入口类 */ public class ATMsystem { public static void main(String[] args) { //1.定义账户类 //2.定义一个集合容器,负责以后存储全部的账户对象,进行相关的业务操作。 ArrayList<Account> accounts = new ArrayList<>(); Scanner sc = new Scanner(System.in); //3.展示系统首页 while (true) { System.out.println("============小鸟银行============"); System.out.println("1.账户登录"); System.out.println("2.账户开户"); System.out.println("做咩啊~"); int command = sc.nextInt(); switch (command) { case 1: //用户登陆操作 login(accounts, sc); break; case 2: //账户开户(alt+enter) register(accounts, sc); break; default: System.out.println("干嘛干嘛,输入的什么玩意~~"); } } } /** * 登录功能 * * @param accounts 全部账户对象的登陆集合 * @param sc 扫描器 */ private static void login(ArrayList<Account> accounts, Scanner sc) { System.out.println("===========系统登录操作==========="); //1.判断账户集合中是否存在账户,如果不存在账户,登录功能不能进行。 if (accounts.size() == 0) { System.out.println("Sorry,当前系统中无任何账户,请先开户捏~"); return;//卫语言风格,解决办法的执行 } //2.正式登录操作 while (true) { System.out.println("请您输入登录的卡号捏~"); String cardId = sc.next(); //3.判断卡号是否存在:根据卡号去账户集合中查询账户对象 Account acc = getAccountByCarId(cardId, accounts); if (acc != null) { //卡号存在 //4.让用户输入登录密码 System.out.println("输入密码就可以登陆咯~"); String passWord = sc.next();//快捷方式,打上sc.next然后打上ctrl+alt+v //判断当前账户对象的密码是否与用户输入的密码一致 if (acc.getPassWord().equals(passWord)) { //登陆成功 System.out.println("恭喜你," + acc.getUserName() + "先生/女士进入系统,您的卡号是:" + acc.getCardId()); //查询 转账 取款 //展示登陆后的操作页 showUserCommand(sc, acc, accounts); return;//干掉登录方法 } else { System.out.println("哦吼,密码不正确捏~"); } } else { System.out.println("Sorry啦~系统中不存在该账户卡号~~"); } } } /** * 用户开户功能的实现 * * @param accounts 接收的账户集合 */ private static void register(ArrayList<Account> accounts, Scanner sc) { System.out.println("===================系统开户操作========================"); // 1、创建一个账户对象,用于后期封装账户信息。 Account account = new Account(); // 2、录入当前这个账户的信息,注入到账户对象中去。 System.out.println("请您输入账户用户名:"); String userName = sc.next(); account.setUserName(userName); while (true) { System.out.println("请您输入账户密码:"); String passWord = sc.next(); System.out.println("请您输入确认密码:"); String okPassWord = sc.next(); if (okPassWord.equals(passWord)) { // 密码认证通过,可以注入给账户对象 account.setPassWord(okPassWord); break; // 密码已经录入成功了,死循环没有必要继续了! } else { System.out.println("对不起,您输入的2次密码不一致,请重新确认~~"); } } System.out.println("请您输入账户当次限额:"); double quotaMoney = sc.nextDouble(); account.setQuotaMoney(quotaMoney); // 为账户随机一个8位且与其他账户的卡号不重复的号码。(独立功能,独立成方法)。 String cardId = getRandomCardId(accounts); account.setCardId(cardId); // 3、把账户对象添加到账户集合中去。 accounts.add(account); System.out.println("恭喜您," + userName + "先生/女士,您开户成功,您的卡号是:" + cardId + ",请您妥善保管卡号"); } /** * 展示登陆后的操作页 */ private static void showUserCommand(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(sc, acc, accounts); break; case 5: //修改密码 updatePassword(sc, acc); return; case 6: //退出 System.out.println("退出成功~"); return;//让当前方法停止执行,跳出去 case 7: //注销账户 if (deleteAccount(acc, sc, accounts)) { return; } else { break; } default: System.out.println("干嘛干嘛,输入的命令不正确!"); } } } /** * 销户功能 * * @param acc * @param sc * @param accounts */ private static boolean deleteAccount(Account acc, Scanner sc, ArrayList<Account> accounts) { System.out.println("=========用户销户操作========="); System.out.println("您真的要销户?y/n"); String rs = sc.next(); switch (rs) { case "y": //真的要销户 //从当前账户集合中,删除当前账户对象,销毁完成 if (acc.getMoney() > 0) { System.out.println("您账户中还有余额,禁止销户~"); } else { accounts.remove(acc); System.out.println("您的账户销户完成~"); return true; } break; default: System.out.println("当前账户继续保留~"); } return false; } /** * 修改密码 * * @param sc 扫描器 * @param acc 自己的账户 */ private static void updatePassword(Scanner sc, Account acc) { System.out.println("=========用户密码修改========="); while (true) { System.out.println("请您输入当前密码:"); String passWord = sc.next(); //1.判断当前密码输入的是否正确 if (acc.getPassWord().equals(passWord)) { while (true) { //密码输入正确 //2.请输入新密码 System.out.println("请您输入新密码:"); String newPassword = sc.next(); System.out.println("请您确认新密码:"); String okPassWord = sc.next(); if (newPassword.equals(okPassWord)) { //2次密码一直,可以修改 acc.setPassWord(okPassWord); System.out.println("恭喜您,密码修改成功~~"); return; } else { System.out.println("您输入的2次密码不一致~"); } } } else { System.out.println("您输入的密码不正确~"); } } } /** * 转账功能 * * @param sc 扫描器 * @param acc 自己的账户 * @param accounts 全部账户的集合 */ private static void transferMoney(Scanner sc, Account acc, ArrayList<Account> accounts) { System.out.println("=========用户转账操作========="); //1.判断是否足够2个账户 if (accounts.size() < 2) { System.out.println("当前系统中不足2个账户,不能转账,快去开户吧~"); return;//结束当前方法 } //2.判断自己的账户是否有钱 if (acc.getMoney() == 0) { System.out.println("余额不足,别转帐啦~"); return; } while (true) { //3.正在开始转账 System.out.println("请您输入对方账户卡号:"); String cardId = sc.next(); //这个卡号不能是自己的卡号 if (cardId.equals(acc.getCardId())) { System.out.println("不能给自己转账哦~"); continue;//结束当次执行,死循环进入下一次 } //判断这个卡号是否存在,根据这个卡号去查询对方账户对象 Account account = getAccountByCarId(cardId, accounts); if (account == null) { System.out.println("对不起,您输入的账户不存在~"); } else { //账户存在后要继续认证收款人的姓氏 String userName = account.getUserName(); String tip = "*" + userName.substring(1); System.out.println("请您输入[" + tip + "]的姓氏"); String preName = sc.next(); if (userName.startsWith(preName)) { while (true) { //认证成功,正真开始转账 System.out.println("请您输入转账金额:"); double money = sc.nextDouble(); //判断余额是否足够 if (money > acc.getMoney()) { System.out.println("对不起,您余额不足,您最多可以转账:" + acc.getMoney()); } else { //余额足够,可以开始转账了 acc.setMoney(acc.getMoney() - money); account.setMoney(account.getMoney() + money); System.out.println("转账成功,您的账户余额还剩余:" + acc.getMoney()); return;//直接干掉转账方法 } } } else { System.out.println("对不起,您输入的信息有误~~"); } } } } /** * 取钱功能 * * @param acc 当前账户对象 * @param sc 扫描器 */ private static void drawMoney(Account acc, Scanner sc) { System.out.println("=========用户取钱操作========="); //1.判断是否足够100元 if (acc.getMoney() < 100) { System.out.println("Sorry啦~当前账户余额少于100元,不能取钱~"); return; } while (true) { //2.提示用户输入取钱金额 System.out.println("请输入取款金额:"); double money = sc.nextDouble(); //3.判断金额是否满足要求 if (money > acc.getMoney()) { System.out.println("对不起您当前取款金额超过每次限额,每次最多可取:" + acc.getQuotaMoney()); return; } else { //没有超过单次限额 //4.判断是否超过账户的总余额 if (money > acc.getMoney()) { System.out.println("余额不足,您当前余额是:" + acc.getMoney()); } else { //可以取钱了 System.out.println("恭喜您,取钱" + money + "元,成功!"); //更新余额 acc.setMoney(acc.getMoney() - money); //取钱结束了 showAccount(acc); return;//干掉取钱方法 } } } } /** * 存钱 * * @param acc 当前账户对象 * @param sc 扫描器 */ private static void depositMoney(Account acc, Scanner sc) { System.out.println("=========用户存钱操作========="); System.out.println("请输入存款余额:"); double money = sc.nextDouble(); //更新账户余额:原来的钱 + 新存入的钱 acc.setMoney(acc.getMoney() + money); System.out.println("存钱成功了捏~"); showAccount(acc); } /** * 展示账户信息 * * @param 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()); } /** * 为账户生成与其他账户卡号不同的号码 * * @param accounts * @return */ private static String getRandomCardId(ArrayList<Account> accounts) { //1.先生成8位数字 Random r = new Random(); while (true) { String carId = ""; for (int i = 0; i < 8; i++) { carId += r.nextInt(10); } //2.判断这8位卡号是否与其他账户卡号重复 //根据这个账户的卡号去查询账户的对象 Account acc = getAccountByCarId(carId, accounts); if (acc == null) { return carId; } } } /** * 根据卡号查询出一个账户对象出来 * * @param carId 卡号 * @param accounts 全部账户集合 * @return 账户对象 | null */ private static Account getAccountByCarId(String carId, ArrayList<Account> accounts) { for (int i = 0; i < accounts.size(); i++) { Account acc = accounts.get(i); if (acc.getCardId().equals(carId)) { return acc; } } return null;//查无此账户 } }