文章目录
Java项目实战:手把手开发ATM银行系统(附完整源码)
本文通过一个完整的ATM系统开发案例,深入讲解Java面向对象编程、集合应用和业务逻辑设计,帮助初学者快速提升项目实战能力
一、系统架构设计
1. 三层架构模型
java
// 1. 账户实体类(数据层)
public class Account {
private String cardId; // 卡号
private String userName; // 用户名
private char sex; // 性别
private String passWord; // 密码
private double money; // 余额
private double limit; // 单次取现额度
// Getter/Setter方法
}
// 2. ATM系统类(业务逻辑层)
public class ATM {
private ArrayList<Account> accounts = new ArrayList<>();
private Scanner sc = new Scanner(System.in);
private Account loginAcc; // 当前登录账户
public void start() { /* 系统入口 */ }
}
// 3. 测试类(表示层)
public class Test {
public static void main(String[] args) {
ATM atm = new ATM();
atm.start(); // 启动系统
}
}
2. 核心数据结构
java
// 使用ArrayList动态存储账户
private ArrayList<Account> accounts = new ArrayList<>();
二、核心功能实现
1. 开户功能(含唯一卡号生成)
java
private void createAccount() {
Account acc = new Account();
// 信息录入(姓名、性别、密码校验)
System.out.print("请输入姓名:");
acc.setUserName(sc.next());
// 性别校验
while(true) {
System.out.print("请输入性别(男/女):");
char sex = sc.next().charAt(0);
if(sex == '男' || sex == '女') {
acc.setSex(sex);
break;
}
}
// 生成唯一卡号(8位数字)
acc.setCardId(createCardId());
accounts.add(acc);
System.out.println("开户成功!卡号:" + acc.getCardId());
}
// 唯一卡号生成算法
private String createCardId() {
Random r = new Random();
while(true) {
String cardId = "";
for(int i=0; i<8; i++) {
cardId += r.nextInt(10);
}
// 检查卡号唯一性
if(getAccountByCardId(cardId) == null) {
return cardId;
}
}
}
2. 登录安全验证
java
private void login() {
if(accounts.isEmpty()) {
System.out.println("系统暂无账户!");
return;
}
while(true) {
System.out.print("输入卡号:");
String cardId = sc.next();
Account acc = getAccountByCardId(cardId);
if(acc != null) {
// 密码尝试次数控制
int tryCount = 0;
while(tryCount < 3) {
System.out.print("输入密码:");
String pwd = sc.next();
if(acc.getPassWord().equals(pwd)) {
loginAcc = acc;
showUserCommand(); // 进入操作界面
return;
}
tryCount++;
}
System.out.println("密码错误次数过多!");
return;
}
}
}
3. 存取款业务
java
// 存款
private void deposit() {
System.out.print("输入存款金额:");
double money = sc.nextDouble();
loginAcc.setMoney(loginAcc.getMoney() + money);
System.out.println("存款成功!余额:" + loginAcc.getMoney());
}
// 取款(含风控校验)
private void withdraw() {
// 最低余额限制
if(loginAcc.getMoney() < 100) {
System.out.println("余额不足100元!");
return;
}
while(true) {
System.out.print("输入取款金额:");
double money = sc.nextDouble();
// 双重校验
if(money > loginAcc.getLimit()) {
System.out.println("超过单笔限额:" + loginAcc.getLimit());
} else if(money > loginAcc.getMoney()) {
System.out.println("余额不足!");
} else {
loginAcc.setMoney(loginAcc.getMoney() - money);
System.out.println("取款成功!余额:" + loginAcc.getMoney());
break;
}
}
}
4. 安全转账实现
java
private void transfer() {
// 系统账户检查
if(accounts.size() < 2) {
System.out.println("系统账户不足!");
return;
}
while(true) {
System.out.print("输入对方卡号:");
String cardId = sc.next();
Account targetAcc = getAccountByCardId(cardId);
if(targetAcc != null) {
// 姓氏验证(安全措施)
String maskName = "*" + targetAcc.getUserName().substring(1);
System.out.print("请输入【" + maskName + "】的姓氏:");
String inputName = sc.next();
if(targetAcc.getUserName().startsWith(inputName)) {
// 转账金额校验
System.out.print("输入转账金额:");
double money = sc.nextDouble();
if(loginAcc.getMoney() >= money) {
// 执行转账
loginAcc.setMoney(loginAcc.getMoney() - money);
targetAcc.setMoney(targetAcc.getMoney() + money);
System.out.println("转账成功!");
return;
} else {
System.out.println("余额不足!");
}
}
}
}
}
三、账户安全管理
1. 密码修改流程
java
private void updatePassword() {
// 原密码验证
System.out.print("输入当前密码:");
String oldPwd = sc.next();
if(!loginAcc.getPassWord().equals(oldPwd)) {
System.out.println("密码错误!");
return;
}
// 新密码二次确认
while(true) {
System.out.print("输入新密码:");
String newPwd = sc.next();
System.out.print("确认新密码:");
String confirmPwd = sc.next();
if(newPwd.equals(confirmPwd)) {
loginAcc.setPassWord(newPwd);
System.out.println("密码修改成功!");
return;
}
System.out.println("两次输入不一致!");
}
}
2. 销户安全规则
java
private void closeAccount() {
// 二次确认
System.out.print("确认销户?(y/n):");
String confirm = sc.next();
if("y".equalsIgnoreCase(confirm)) {
// 余额检查
if(loginAcc.getMoney() > 0) {
System.out.println("账户仍有余额,无法销户!");
return;
}
accounts.remove(loginAcc);
System.out.println("销户成功!");
}
}
四、项目亮点与优化建议
安全设计亮点:
- 卡号唯一性校验:8位随机数+重复检测
- 敏感操作验证:转账时的姓氏确认
- 密码安全策略:修改密码需原密码+二次确认
- 余额保护机制:销户前余额强制清零
可扩展功能:
基础功能 交易记录 利息计算 多币种支持 短信通知
性能优化建议:
- 使用HashMap优化账户查找:
HashMap<String, Account>
- 添加交易流水记录功能
- 实现数据持久化(文件存储)
- 增加每日交易限额控制
源码获取 :ATM系统完整项目代码
五、学习收获总结
通过本项目,开发者将掌握:
-
面向对象设计能力
- 实体类的合理封装
- 业务逻辑分层实现
-
集合框架实战应用
- ArrayList的CRUD操作
- 集合元素的遍历与查找
-
业务逻辑设计思维
- 金融级安全校验
- 异常流程处理
- 用户交互设计
-
项目架构能力
- 三层架构实现
- 高内聚低耦合设计
项目总结:本ATM系统涵盖了Java核心技术的实际应用,是初学者进阶的绝佳练手项目。通过实现金融级业务逻辑,开发者能够深入理解面向对象设计思想,为后续企业级开发奠定坚实基础。