Java实现银行ATM模拟系统全流程(解题思路 + 核心知识点整理)

张开发
2026/5/2 17:23:37 15 分钟阅读

分享文章

Java实现银行ATM模拟系统全流程(解题思路 + 核心知识点整理)
一、解题思路完整业务流程 代码逻辑1. 需求分析这是一个控制台版银行 ATM 模拟系统实现用户开户、登录、查询、存款、取款、转账、改密、销户、退出全套核心功能基于 Java 面向对象思想开发。2. 整体设计思路1核心实体设计用Account类封装账户属性卡号、用户名、性别、密码、余额、取现额度作为数据载体。2功能类设计用ATMMsg类实现业务逻辑包含 3 大核心模块数据管理用ArrayListAccount集合存储所有账户交互控制提供系统入口、主界面、功能菜单功能实现封装开户、登录、存取款等所有操作方法。3执行流程核心脉络系统启动start()方法展示首页登录 / 开户用户开户createAccount()收集信息→生成唯一 8 位卡号→存入集合用户登录login()校验卡号、密码→登录成功赋值loginAcc记录当前用户功能操作showAccountHTML()展示功能菜单根据选择调用对应方法退出 / 销户退出返回首页销户需余额为 0从集合删除账户。3. 关键功能实现思路唯一卡号生成随机生成 8 位数字遍历集合校验重复确保不冲突登录状态管理用成员变量loginAcc保存当前登录账户全局共享转账安全校验先判断账户数量→校验对方卡号→校验姓氏→校验余额→完成转账异常控制余额不足、密码错误、性别输入错误等场景做循环校验提升健壮性。( 一 )先看整体架构代码的顶层设计1. 两个核心类Account 账户类装数据卡号、用户名、性别、密码、余额、取现额度→只负责存数据不负责操作ATMMsg 系统操作类负责所有功能开户、登录、查询、存取款、转账、改密、销户→只负责逻辑处理不负责存数据设计思想数据和操作分离结构清晰方便维护。2. 三个全局成员变量贯穿整个系统java运行// 存所有账户 private ArrayListAccount accounts new ArrayList(); // 键盘输入 private Scanner sc new Scanner(System.in); // 记录【当前登录的账户】所有功能都用它 Account loginAcc null;accounts系统的 “账户数据库”sc系统的 “输入工具”loginAcc最重要登录成功后赋值所有功能都操作这个对象( 二 )、代码执行流程从启动到结束第一步系统启动start()java运行public void start() { while (true) { 欢迎界面 1 登录 2 开户 } }死循环展示首页不会退出用户选 1 → 登录用户选 2 → 开户第二步用户开户createAccount()思路收集信息 → 校验 → 生成唯一卡号 → 存入集合让用户输入用户名、性别、密码两次确认、取现额度调用createCardId()生成8 位不重复卡号把信息封装成Account对象添加到accounts集合提示开户成功显示卡号子方法生成唯一卡号createCardId()随机生成 8 位数字调用getAccountCardId()查是否重复重复就重新生成不重复就返回→保证系统里没有相同卡号子方法根据卡号查账户getAccountCardId()遍历集合比对卡号找到返回账户没找到返回null→全系统通用查询工具第三步用户登录login()思路判断有无账户 → 输卡号 → 查账户 → 输密码 → 登录成功如果集合为空 → 提示先开户输入卡号 → 调用查询方法判断是否存在卡号存在 → 输入密码比对密码正确 → 把账户赋值给loginAcc进入功能页面showAccountHTML()关键点loginAcc account;这一行让后续所有功能都知道当前是谁在操作。第四步功能菜单showAccountHTML()java运行while(true){ 1查询 2存款 3取款 4转账 5改密 6退出 7销户 }死循环展示功能switch根据用户选择调用对应方法退出 / 销户成功 →return回到首页( 三 )、核心功能思路分析1. 查询账户queryAccount()直接从loginAcc取出信息打印→最简单只读取数据2. 存款cunMoney()输入金额loginAcc.setMoney(原金额 存入金额)→直接修改当前登录账户的余额3. 取款quMoney()思路校验 → 扣款余额低于 100 不能取输入金额判断是否超过余额判断是否超过单日限额都满足 → 扣款更新余额4. 转账transferMoney()最复杂功能思路非常严谨系统至少 2 个账户才能转当前账户余额不能为 0输入对方卡号 → 查询是否存在校验对方姓氏安全验证输入转账金额自己余额够不够自己扣款对方加钱→一套完整安全校验模拟真实银行逻辑5. 修改密码updatePassword()输入旧密码验证输入两次新密码一致就更新loginAcc的密码6. 注销账户deleteAccount()确认是否注销余额必须为 0 才能注销从集合accounts中删除当前账户删除成功 → 退回首页二、完整代码示例代码一: (账户类)package atm; /** * 账户类 */ public class Account { private String cardId;//卡号 private String userName;//用户名 private char sex;// 性别 private String password;//密码 private double money;//余额 private double limit;//限额 public Account() { } public Account(String cardId, String userName, char sex, String password, double money, double limit) { this.cardId cardId; this.userName userName; this.sex sex; this.password password; this.money money; this.limit limit; } public String getCardId() { return cardId; } public void setCardId(String cardId) { this.cardId cardId; } public String getUserName() { return userName (this.sex 男 ? 先生 : 女士); } public void setUserName(String userName) { this.userName userName; } public char getSex() { return sex; } public void setSex(char sex) { this.sex sex; } 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 getLimit() { return limit; } public void setLimit(double limit) { this.limit limit; } }代码二: (操作类)package atm; import java.util.ArrayList; import java.util.Random; import java.util.Scanner; /** * 银行ATM系统操作类 */ public class ATMMsg { //管理账户信息并且对用户的操作功能用户登录用户开户查询转载... //1.创建一个集合用来保存账户信息 private ArrayListAccount accounts new ArrayList(); //键盘录入 private Scanner sc new Scanner(System.in); //在成员位置定义一个变量记录当前账户的信息 登录成功后将账户信息重新赋值过来的 Account loginAcc null; /** * 用户操作界面 */ public void showAccountHTML() { while(true){ //如何获取当前登录成功的账户信息 System.out.println(loginAcc.getUserName()您可以选择如下功能进行账户的处理); 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: //查询当前账户信息 this.queryAccount(); break; case 2: //存款 this.cunMoney(); break; case 3: //取钱 this.quMoney(); break; case 4: //转账 this.transferMoney(); break; case 5: //密码修改 this.updatePassword(); break; case 6: //System.exit(0);//退出系统 System.out.println(loginAcc.getUserName() 您已退出当前账户...); return; case 7: //注销当前账户 if (this.deleteAccount()){ //true 消户 false 不消户 return; //跳出当前方法 取决于是否消户 } break; default: System.out.println(没有该操作...,请重新操作...); } } } /** *注销账户操作 */ public boolean deleteAccount() { //提示信息 System.out.println(注销账户操作); System.out.println(亲您确定要注销账户吗 y/n :); String command sc.next(); switch (command){ case y: //注销操作 还要将系统中的账户消除 //注销前先看账户中是否有金额 if (loginAcc.getMoney() 0.0) { accounts.remove(loginAcc); System.out.println(您当前账户以及成功注销...); return true; }else{ System.out.println(对不起您当前账户中有金额当前账户金额是 loginAcc.getMoney()); return false; } default: System.out.println(好的您的帐号保留....); return false; } } /** * 修改密码操作 */ public void updatePassword() { System.out.println(修改密码操作); while (true){ //先输入原来的密码 System.out.println(请您输入当前账户密码:); String password sc.next(); //让输入的密码与当前账户的密码比对 if (loginAcc.getPassword().equals(password)){ //老的密码正确 才可以设置新的密码 //输入新的密码 while (true){ System.out.println(请您输入账户新密码); String newPassword sc.next(); System.out.println(请确认您输入的新密码); String oknewPassword sc.next(); //判断 if (newPassword.equals(oknewPassword)){ //设置密码 loginAcc.setPassword(newPassword); System.out.println(当前账户密码修改成功); return; }else{ System.out.println(两次密码不一致请重新输入...); } } }else{ System.out.println(当前输入的密码错误请核对...); } } } /** * 转账操作 */ public void transferMoney() { /** * 转账操作 * 1.判断当前系统中是否有多个账户一个账户不可以实现转账系统必须至少两个账户以上 * 2.考虑当前账户余额 如果当前账户余额是0.0 提示余额不足 否则可以转账 * 2.1 判断对方账户是否存在/正确 * 如果不正确 提示 您输入的卡号不存在请核对... * 如果正确 校验姓氏问题 * 如果姓氏错误 提示 您输入的姓氏有误请重新输入... * 如果卡号正确姓氏正确 实现转账操作 * 3.转账的金额是否大于自身的金额 * 如果大于自己的金额 提示 您的账户余额不足请重新输入... * 如果不大于 转账操作 * A 和 B 转账 * A的金额应该是减的操作 减完要更新自己的金额 * B的余额应该是加的操作 加完要更新对方的金额 * 更新完成转账操作完成 * 跳出此方法 */ // 1.判断当前系统中是否有多个账户 System.out.println(转账操作); if (accounts.size() 2){ System.out.println(系统至少需要两个账户才能进行转账操作...); return; } //2.考虑当前账户余额 如果当前账户余额是0.0 提示余额不足 否则可以转账 if (loginAcc.getMoney() 0.0){ System.out.println(您的账户余额不足请充值...); } while (true) { //实现转账操作 System.out.println(请您输入对方的卡号); String cardId sc.next(); //校验卡号是否存在 Account acc getAccountCardId(cardId); if (acc null) { System.out.println(您输入的卡号不存在请核对...); } else { //再进行姓氏的校验 刘德华 截取后并拼接 *号 *德华 //获取当前账户的账户名 String name * acc.getUserName().substring(1); //请您输入 *德华的姓氏 System.out.println(请您输入【 name 】的姓氏); //提示让用户名输入姓氏 String preName sc.next(); //刘德华 startWith是否以什么开头 if (acc.getUserName().startsWith(preName)){ while (true){ //转账操作 System.out.println(请输入取款金额); double money sc.nextDouble(); //判断 自身金额是否大于转账金额 if(loginAcc.getMoney() money){ //实现转账操作 //柳岩给刘德华转账 //柳岩是减的操作 更新自己金额转账后的金额 loginAcc.setMoney(loginAcc.getMoney() - money); //刘德华是加的操作 更新对方金额收完钱后的金额 acc.setMoney(acc.getMoney() money); System.out.println(转账成功了...); }else{ System.out.println(您的余额不足当前余额是 loginAcc.getMoney() 元...); } } }else{ System.out.println(您输入的姓氏有误请重新输入...); } } } } /** * 取钱操作 */ public void quMoney() { System.out.println(取钱操作); if (loginAcc.getMoney() 100) { System.out.println(您的账户余额是 loginAcc.getMoney() 低于100元不能取钱...); return; } //实现取钱操作 while (true) { System.out.println(请您输入取款金额); double money sc.nextDouble();//取款金额 if (loginAcc.getMoney() money){ //判断取款的金额与每次的限额 if (money loginAcc.getLimit()){ System.out.println(每次只能取loginAcc.getLimit() 限额的钱); }else { //则在当前余额上减去取钱的金额得到新的余额 并将新的余额设置给账户对象 //重新设置当前账户的余额 loginAcc.setMoney(loginAcc.getMoney() - money); System.out.println(您取款 money 元成功当前账户余额是 loginAcc.getMoney()); break; } }else { System.out.println(您的账户余额不足您的账户余额是 loginAcc.getMoney() 元); } } } /** * 存钱操作 */ public void cunMoney() { System.out.println(存钱操作); System.out.println(请输入您要存的钱数); double money sc.nextDouble(); //更新账户的金额账户本身的金额存款的金额 /** * loginAcc.getMoney() 当前账户的金额 * money 输入的金额 */ loginAcc.setMoney(loginAcc.getMoney() money); System.out.println(恭喜您您存钱 money 成功存钱后的金额是 loginAcc.getMoney()); } /** * 查询当前账户信息 */ public void queryAccount() { System.out.println(当前您的账户信息如下); System.out.println(卡号 loginAcc.getCardId()); System.out.println(户主 loginAcc.getUserName()); System.out.println(性别 loginAcc.getSex()); System.out.println(余额 loginAcc.getMoney()); System.out.println(每次取现的额度 loginAcc.getLimit()); } //2.编写系统的欢迎界面 public void start() { while (true) { System.out.println(欢迎进入到ATM系统); System.out.println(1.用户登录); System.out.println(2.用户开户); System.out.println(请选择); int command sc.nextInt(); switch (command) { case 1: //System.out.println(用户登录功能...); this.login(); break; case 2: //System.out.println(用户开户功能...); this.createAccount(); break; default: System.out.println(没有该操作...,请重新操作...); } } } //登录功能 public void login() { //判断当前系统中是否存在账户 if (accounts.size() 0){ System.out.println(当前系统中无任何账户信息请先开户登录...); //然后结束当前方法 return; } //判断卡号是否存在 while (true){ //如果存在输入卡号和密码登录 System.out.println(请输入您的卡号); String cardId sc.next(); //判断卡号是否正确卡号是否存在 根据卡号查询当前账户信息 Account account getAccountCardId(cardId); if(account null){ //卡号不存在 System.out.println(您输入的卡号不存在请重新输入...); }else { while (true) { //卡号存在 //判断密码输入是否正确 System.out.println(请输入登录密码); String password sc.next(); //判断手动输入的密码与注册用户是填写的密码做比对 if (account.getPassword().equals(password)) { //account 当前登录的账户信息 loginAcc account; //登录成功 System.out.println(恭喜您account.getUserName()先生成功登录了系统您的卡号是account.getCardId()); //用户登录成功后进行当前用户操作界面取钱存钱转账... //TOOO 用户操作界面 this.showAccountHTML(); //登录成功后要结束当前方法 return; } else { //密码输入错误 System.out.println(您输入的密码有误请重新输入...); } } } } } //3.编写开户功能 public void createAccount() { System.out.println(系统开户操作); //创建账户对象 Account acc new Account(); //手动用户输入对应的账户名 性别 密码 提现额度 //设置账户用户名 System.out.println(请您输入您的账号用户名); String name sc.next(); acc.setUserName(name); //设置性别 while (true) { System.out.println(请您输入您的性别); char sex this.sc.next().substring(0,1).charAt(0); //判断 if (sex 男 || sex 女) { acc.setSex(sex); break; } else { System.out.println(您输入的性别有误请重新输入...); } } //设置密码 while (true) { System.out.println(请您输入您的密码); String passwork sc.next(); System.out.println(请再次输入您的密码); String okpasswork sc.next(); //判断 if (passwork.equals(okpasswork)) { //设置密码 acc.setPassword(okpasswork); break; } else { System.out.println(密码不一致请重新输入...); } } //设置提现额度 System.out.println(请您输入您的提现额度); double limit sc.nextDouble(); acc.setLimit(limit); //重点生成一个8位数的卡号 单写一个方法生成 String cardId this.createCardId(); acc.setCardId(cardId); //将每一个账号信息存储到集合中 accounts.add(acc); System.out.println(恭喜您, acc.getUserName() ,您开户成功您的卡号是acc.getCardId()); } /** * 生成8位随机数 */ public String createCardId() { while (true){ //定义一个变量用来接收生成数字的组合 String cardId ; Random rd new Random(); //生成8个数 for (int i 0; i 8; i) { int date rd.nextInt(10);//0-9以内 cardId date; } //生成的当前卡号 与其他用户有没有一样的 随机生成有可能存在一样的卡号 //将我们生成的卡号 与 所有账户的每一个卡号比对 如果存在 重新生成如果不存在直接使用 Account account this.getAccountCardId(cardId); //对象/null if (account null){ //直接使用当前生成的卡号了 return cardId; } } } /** * 根据生成的卡号与所有账户中的每一个卡号进行比对 * param cardId 随机生成的卡号 */ public Account getAccountCardId(String cardId){ //获取集合中的所有账户 遍历 for (int i 0; i accounts.size(); i) { Account account accounts.get(i); //判断 if (account.getCardId().equals(cardId)){ return account; } } return null; } }代码三(测试类)package atm; /** * 测试类 */ public class ATMTest { public static void main(String[] args) { ATMMsg atmMsg new ATMMsg(); atmMsg.start(); } }三、核心知识点整理1. Java 面向对象OOP核心知识点表格知识点用法说明封装用Account类私有化成员变量提供get/set方法访问数据保护数据安全类与对象Account是模板ATMMsg是操作类通过创建对象调用方法实现功能成员变量accounts存储账户、sc键盘录入、loginAcc当前登录账户2. 集合框架知识点ArrayList动态数组用于存储多个账户对象支持增删改查核心方法add()添加账户、remove()删除账户、get()获取账户、size()获取账户数量。3. 流程控制知识点循环while(true)死循环实现菜单反复展示、输入错误重新录入分支switch-case实现菜单选择if-else实现条件校验跳转break跳出循环、return结束方法、System.exit(0)退出 JVM。4. 常用 API 知识点Scanner实现控制台键盘录入支持next()、nextInt()、nextDouble()Random生成随机数用于创建 8 位唯一卡号字符串方法equals()比对卡号、密码是否一致字符串必须用 equals不能用 startsWith()转账时校验用户姓氏substring()截取用户名实现隐私隐藏charAt()截取性别字符。5. 方法设计知识点方法抽取把独立功能生成卡号、根据卡号查账户抽成单独方法代码复用参数与返回值方法接收参数如卡号返回账户对象 / 布尔值实现数据传递权限控制业务方法私有化仅对外暴露start()入口方法。6. 业务逻辑知识点状态共享用成员变量记录登录账户所有功能直接使用安全校验密码二次确认、转账多重校验、销户余额判断健壮性输入错误不崩溃给出提示并重新录入。四、核心解题步骤总结先设计账户实体类封装所有属性搭建ATM 操作类定义集合、扫描器、登录变量实现系统入口展示登录 / 开户菜单逐一对接核心功能先完成基础流程再补充校验逻辑测试所有功能修复空指针、输入异常等问题。总结解题核心面向对象 集合存储 流程控制先理清业务流程再写代码重点知识ArrayList、Scanner、字符串比对、方法封装、循环校验设计思想数据与操作分离代码复用提升系统健壮性和易用性。

更多文章