一、项目概述
通过控制台实现一个具备完整金融功能的ATM系统,包含以下核心功能:
✅ 用户管理
✅ 存款/取款(限额控制)
✅ 跨账户转账
✅ 密码修改
✅ 账户销户
✅ 信息查询
技术栈:面向对象编程、集合框架、流程控制
二、核心功能演示
1. 开户流程
控制台输入姓名->性别->密码->生成唯一卡号
2. 转账验证
采用双重验证机制:
2. 核心业务逻辑
ATM类包含:
-
目标账户存在性校验
-
转账人姓氏二次确认
// 转账验证代码片段 System.out.println("请输入"+loginUser.getName().substring(1)+"姓氏:"); String Nam = scanner.next(); if(Nam.charAt(0) == loginUser.getName().charAt(0)){ // 执行转账逻辑 }
三、关键技术实现
1. 面向对象设计
Account类(原Accent类)封装账户实体:
public class Accent { private String num; private String name; private char sex; private String passWord; private double money; private double limit; public Accent() { } public Accent(String num, String name, char sex, String passWord, double money, double limit) { this.num = num; this.name = name; this.sex = sex; this.passWord = passWord; this.money = money; this.limit = limit; } public String getNum() { return num; } public void setNum(String num) { this.num = num; } public String getName() { return name + (sex =='男'?"先生":"女士"); } public void setName(String name) { this.name = name; } 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; } }
2. ATM核心逻辑(ATM.java)
import java.util.ArrayList; import java.util.Objects; import java.util.Random; import java.util.Scanner; public class ATM { private ArrayList<Account> accounts = new ArrayList<>(); private Account loginUser; private Scanner scanner = new Scanner(System.in); public void start() { // 主菜单逻辑(完整实现) while (true) { System.out.println("\n===欢迎使用ATM系统==="); System.out.println("1. 用户登录"); System.out.println("2. 用户开户"); System.out.print("请选择:"); int choice = scanner.nextInt(); switch (choice) { case 1: login(); break; case 2: createAccount(); break; default: System.out.println("输入错误,请重新输入!"); } } } // 开户功能完整实现 private void createAccount() { System.out.println("\n===开户功能==="); Account acc = new Account(); // 姓名输入 System.out.print("请输入姓名:"); acc.setName(scanner.next()); // 性别校验 while (true) { System.out.print("请输入性别(男/女):"); char gender = scanner.next().charAt(0); if (gender == '男' || gender == '女') { acc.setSex(gender); break; } System.out.println("输入错误,请重新输入!"); } // 密码校验 while (true) { System.out.print("设置密码:"); String pw = scanner.next(); System.out.print("确认密码:"); if (pw.equals(scanner.next())) { acc.setPassWord(pw); break; } System.out.println("两次密码不一致!"); } // 设置限额 System.out.print("设置单笔取现限额:"); acc.setLimit(scanner.nextDouble()); // 生成唯一卡号 acc.setNum(generateCardNumber()); accounts.add(acc); System.out.println("开户成功!卡号:" + acc.getNum()); } // 登录功能完整实现 private void login() { System.out.println("\n===登录功能==="); if (accounts.isEmpty()) { System.out.println("系统暂无账户!"); return; } Account acc; while (true) { System.out.print("输入卡号:"); String cardNum = scanner.next(); if ((acc = getAccount(cardNum)) != null) break; System.out.println("卡号不存在!"); } while (true) { System.out.print("输入密码:"); if (scanner.next().equals(acc.getPassWord())) { loginUser = acc; System.out.println("欢迎," + acc.getName()); showUserMenu(); return; } System.out.println("密码错误!"); } } // 用户菜单完整实现 private void showUserMenu() { while (true) { System.out.println("\n===主功能菜单==="); 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.print("请选择:"); switch (scanner.nextInt()) { case 1: showBalance(); break; case 2: deposit(); break; case 3: withdraw(); break; case 4: transfer(); break; case 5: changePassword(); break; case 6: logout(); return; case 7: deleteAccount(); return; default: System.out.println("无效输入!"); } } } // 转账功能完整实现示例 private void transfer() { System.out.println("\n===转账功能==="); if (accounts.size() < 2) { System.out.println("系统账户不足,无法转账!"); return; } Account targetAcc; while (true) { System.out.print("输入对方卡号:"); String cardNum = scanner.next(); if ((targetAcc = getAccount(cardNum)) != null) break; System.out.println("卡号不存在!"); } // 验证姓氏 System.out.print("验证您的姓氏:"); if (!scanner.next().equals(loginUser.getName().substring(0, 1))) { System.out.println("验证失败!"); return; } // 转账金额处理 System.out.print("输入转账金额:"); double amount = scanner.nextDouble(); if (amount > loginUser.getMoney()) { System.out.println("余额不足!"); } else if (amount > loginUser.getLimit()) { System.out.println("超过单笔限额!"); } else { loginUser.setMoney(loginUser.getMoney() - amount); targetAcc.setMoney(targetAcc.getMoney() + amount); System.out.println("转账成功!当前余额:" + loginUser.getMoney()); } } // 其他方法实现(篇幅限制部分展示) private String generateCardNumber() { Random rand = new Random(); String cardNum; do { cardNum = String.format("%08d", rand.nextInt(100000000)); } while (getAccount(cardNum) != null); return cardNum; } private Account getAccount(String cardNum) { for (Account acc : accounts) { if (acc.getNum().equals(cardNum)) return acc; } return null; } // 其他功能方法(存款、取款等)... }
3. 启动类(test.java)
public class test { public static void main(String[] args) { ATM atm = new ATM(); atm.start(); } }
三、代码解析
1. 实体类设计
Account
类使用封装原则: -
所有字段private
-
通过Getter/Setter访问
-
业务逻辑方法(如带称谓的getName())
-
ArrayList<Account>
存储账户 -
Scanner处理用户输入
-
状态管理(loginUser)
-
运行效果
===欢迎使用ATM系统=== 1. 用户登录 2. 用户开户 请选择:2 ===开户功能=== 请输入姓名:张三 请输入性别(男/女):男 设置密码:123456 确认密码:123456 设置单笔取现限额:2000 开户成功!卡号:67453921