文章目录

    • Java项目实战:手把手开发ATM银行系统(附完整源码)
      • 一、系统架构设计
        • 1. 三层架构模型
        • 2. 核心数据结构
      • 二、核心功能实现
        • 1. 开户功能(含唯一卡号生成)
        • 2. 登录安全验证
        • 3. 存取款业务
        • 4. 安全转账实现
      • 三、账户安全管理
        • 1. 密码修改流程
        • 2. 销户安全规则
      • 四、项目亮点与优化建议
        • 安全设计亮点:
        • 可扩展功能:
        • 性能优化建议:
      • 五、学习收获总结

Java项目实战:手把手开发ATM银行系统(附完整源码)

本文通过一个完整的ATM系统开发案例,深入讲解Java面向对象编程、集合应用和业务逻辑设计,帮助初学者快速提升项目实战能力

一、系统架构设计

1. 三层架构模型
// 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. 核心数据结构
// 使用ArrayList动态存储账户
private ArrayList<Account> accounts = new ArrayList<>();

二、核心功能实现

1. 开户功能(含唯一卡号生成)
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. 登录安全验证
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. 存取款业务
// 存款
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. 安全转账实现
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. 密码修改流程
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. 销户安全规则
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("销户成功!");}
}

四、项目亮点与优化建议

安全设计亮点:
  1. 卡号唯一性校验:8位随机数+重复检测
  2. 敏感操作验证:转账时的姓氏确认
  3. 密码安全策略:修改密码需原密码+二次确认
  4. 余额保护机制:销户前余额强制清零
可扩展功能:
基础功能
交易记录
利息计算
多币种支持
短信通知
性能优化建议:
  1. 使用HashMap优化账户查找:HashMap<String, Account>
  2. 添加交易流水记录功能
  3. 实现数据持久化(文件存储)
  4. 增加每日交易限额控制

源码获取:ATM系统完整项目代码

五、学习收获总结

通过本项目,开发者将掌握:

  1. 面向对象设计能力

    • 实体类的合理封装
    • 业务逻辑分层实现
  2. 集合框架实战应用

    • ArrayList的CRUD操作
    • 集合元素的遍历与查找
  3. 业务逻辑设计思维

    • 金融级安全校验
    • 异常流程处理
    • 用户交互设计
  4. 项目架构能力

    • 三层架构实现
    • 高内聚低耦合设计

项目总结:本ATM系统涵盖了Java核心技术的实际应用,是初学者进阶的绝佳练手项目。通过实现金融级业务逻辑,开发者能够深入理解面向对象设计思想,为后续企业级开发奠定坚实基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/909925.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/909925.shtml
英文地址,请注明出处:http://en.pswp.cn/news/909925.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络:(五)信道复用技术,数字传输系统,宽带接入技术

计算机网络&#xff1a;&#xff08;五&#xff09;信道复用技术&#xff0c;数字传输系统&#xff0c;宽带接入技术 前言一、信道复用技术1. 为什么需要复用技术&#xff1f;2. 频分复用&#xff08;FDM&#xff09;3. 时分复用&#xff08;TDM&#xff09;4. 统计时分复用&am…

【期末总结】计算机网络

【期末总结】计算机网络 参考链接&#xff1a;计算机网络知识点全面总结&#xff08;有这一篇就够了&#xff01;&#xff01;&#xff01;&#xff09;-CSDN博客 一.概述 1.1 计算机网络的分类 按照网络的作用范围&#xff1a;广域网&#xff08;WAN&#xff09;、城域网&a…

React学习001-创建 React 应用

React学习001-创建 React 应用 1、安装node.js2、安装构建工具2.1 核心特性2.2 性能对比​​2.3 适用场景​​ 3、创建应用4、项目启动参考文章 1、安装node.js 这里建议安装nvm多版本管理node.js&#xff0c;想用哪个版本&#xff0c;一条命令即可~ 多版本管理node.js 2、安…

(cvpr2025) Adaptive Rectangular Convolution for Remote Sensing Pansharpening

论文&#xff1a;(cvpr2025) Adaptive Rectangular Convolution for Remote Sensing Pansharpening 代码&#xff1a;https://github.com/WangXueyang-uestc/ARConv.git 这个论文研究的是全色与多光谱图像的融合。作者认为现有的基于CNN的方法中&#xff0c;传统的卷积存在两个…

【图像处理入门】7. 特征描述子:从LBP到HOG的特征提取之道

摘要 特征描述子是图像处理中提取图像本质信息的关键工具。本文将深入讲解局部二值模式(LBP)与方向梯度直方图(HOG)两种经典特征描述子的原理、实现方法及应用场景。结合OpenCV代码示例,展示如何利用LBP提取纹理特征、使用HOG进行目标检测,帮助读者掌握从图像中提取有效…

AI 应用开发的‘核心枢纽’:Dify、Coze、n8n、FastGPT、MaxKB、RAGFlow 等六大平台全面对决

在人工智能与自动化流程日益普及的当下&#xff0c;各类平台如雨后春笋般涌现&#xff0c;成为构建智能应用与自动化工作流的 “核心枢纽”。其中&#xff0c;Dify、Coze、n8n、FastGPT、MaxKB、RAGFlow 备受瞩目&#xff0c;它们各自具备独特的功能与优势&#xff0c;适用于不…

RV1126+OPENCV对视频流单独进行视频膨胀/腐蚀操作

一.RV1126OPENCV对视频流进行视频膨胀操作的大体流程图 思路&#xff1a;初始化VI与VENC模块&#xff0c;之后开启两个线程&#xff0c;一个线程从VI模块获取视频流数据&#xff0c;用Opencv的Mat将其转成Mat矩阵之后进行用dilate膨胀&#xff0c;将膨胀之后的视频数据用send函…

Cordova + Vue 移动端视频播放组件(支持 HLS + 原生播放器兜底)

在混合 App 中&#xff0c;移动端使用 标签播放视频经常踩坑&#xff0c;尤其是格式兼容、跨域限制、WebView 差异等问题。 本文介绍一个通用的 Cordova 视频播放组件&#xff1a;优先 HTML5 播放&#xff0c;播放失败自动提示用户使用系统播放器&#xff0c;并支持原生插件兜底…

【Linux】掌握vim编译器使用——详细教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、Vim的三种核心模式解析 二、高效编辑核心命令大全 1. 光标快速导航 2. 文本编辑四连击 3. 高效搜索替换 三、Vim神技&#xff1a;批量注释与多文件编辑 1. 批量…

Oracle迁移瀚高,如何做表等对象与文件名一对一的文件脚本(APP)

文章目录 环境文档用途详细信息 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;4.5 文档用途 Oracle迁移到瀚高后&#xff0c;需要整理一张表对应一个与表同名的脚本&#xff0c;一个函数对应一个与函数同名的脚本 详细信息 一、整理…

洞察分享 | 在万物互联的时代,如何强化网络安全,更有效地保护工业基础设施?

2025年&#xff0c;物联网&#xff08;IoT&#xff09;与互联系统已深度融入工业4.0的发展之中&#xff0c;同时也带来了前所未有的网络安全挑战。随着工业系统的互联互通不断加深&#xff0c;网络攻击的范围和类型不断增加&#xff0c;关键基础设施因此面临更高的网络风险暴露…

k8s 1.23.6版本apiserver list-watch原理机制

Kubernetes 1.23.6 版本中&#xff0c;API Server 的 **List-Watch 机制** 是集群状态同步的核心机制&#xff0c;其设计目标是高效、实时地将资源变更通知到各组件&#xff08;如 kubelet、controller-manager等&#xff09;。以下是其详细原理和工作机制&#xff1a; 1. 核心…

Linux基本指令篇 —— mkdir指令

mkdir是Linux和Unix-like系统中用于创建目录的基本命令&#xff0c;全称为"make directory"。下面将详细介绍这个命令的用法、选项和实际应用。 目录 一、基本语法 二、基本用法 创建单个目录 创建多个目录 三、常用选项 -p 或 --parents -m 或 --mode -v 或 …

聊聊GPIO 工作模式

嵌入式开发中&#xff0c;GPIO&#xff08;General-Purpose Input/Output&#xff09;是最基础也最常用的功能模块之一。你可以把它想象成微控制器伸出来的无数根“手脚”&#xff1a;既可以用它输出信号去点亮LED、驱动外设&#xff0c;也可以用它输入信号来检测按键、读取传感…

DM9000AE+STM32H7在rt-thread中的使用

概述 记录下DM9000AE在rt-thread上的使用 FMC的配置 rt-thread的网络设备驱动注册 硬件连接 16bit总线 挂在FMC_A0 地址0x6000_0000 FMC的配置 FMC是STM32H7的一个外设&#xff0c;通过FMC把DM9000当做一个SRAM来访问&#xff0c;只需要配置好FCM的时序就可以了。 DM9000…

TiDB 字符串行转列与 JSON 数据查询优化知识笔记

一、长字符串行转列方案 JSON_TABLE 方案&#xff08;TiDB 5.0 推荐&#xff09; 通过将逗号分隔字符串转为 JSON 数组后展开为行&#xff1a; sql SET str ‘a,b,c,d’; SELECT jt.val, jt.pos FROM JSON_TABLE( CONCAT(‘[’, REPLACE(str, ‘,’, ‘“,”’), ‘"]’…

1 Studying《Performance Analysis and Tuning on Modern CPUs》7-11

目录 Part2. Source Code Tuning For CPU 数据驱动优化 7 CPU Front-End Optimizations 7.1 Machine code layout //机器码布局 7.2 Basic Block 7.3 Basic block placement 7.4 Basic block alignment 7.5 Function splitting //函数拆分 7.6 Function groupin…

WinUI3入门6:子线程处理UI 窗口加载后执行 获取和设置控件尺寸 自动生成事件代码框架

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

中国招聘智能化白皮书:从 “人撑不住“ 到 “AI 破局“ 的底层逻辑革命——AI得贤招聘官第六代AI面试官

一场面试&#xff0c;牵动一家公司的人力系统。 当简历数量以千计堆叠、当HR通宵挑灯刷筛选、当面试质量与效率陷入两难&#xff0c;招聘不再只是流程问题&#xff0c;而成了“组织生存”的关键变量。 问题是&#xff1a;靠人&#xff0c;已经撑不住了。 企业招聘正步入前所…