讲师中心 微信公众号
AI工具推荐 视频效率加速

在Java里如何实现简单的银行账户管理系统_Java面向对象应用解析

胖墨姑娘_8488

胖墨姑娘_8488

发布时间:2026-02-19 11:46:03

|

588人浏览过

|

来源于php中文网

原创

Account类应封装状态变更规则:balance设为private,仅提供getBalance()读取;存款、取款、转账均通过方法实现,且各方法内部校验合法性(如余额非负、账户有效等)。

在java里如何实现简单的银行账户管理系统_java面向对象应用解析

Account 类怎么设计才符合银行账户的业务逻辑

银行账户不是普通数据容器,必须封装状态变更规则。比如余额不能为负、转账需校验双方账户有效性、操作要带时间戳。直接用 public double balance 是危险的——外部可随意修改,失去控制权。

实操建议:

  • 把 balance 设为 private,只提供 getBalance() 读取,不暴露 setter
  • 所有写操作通过方法实现: deposit(double amount)、withdraw(double amount)、transferTo(Account target, double amount)
  • 每个方法内部做合法性检查:if (amount
  • 建议在构造时强制传入初始余额和账号(String accountNumber),避免空对象

为什么 withdraw() 方法里要用 if-else 而不是直接减法

因为银行系统必须拒绝非法取款,而不是让余额变负数再抛异常。很多初学者写成 balance -= amount 后判断是否为负,这已造成状态污染——错误发生后余额已被错误修改,回滚困难。

正确做法是先验证,再变更:

立即学习“Java免费学习笔记(深入)”;

java-api-doc-generator
java-api-doc-generator

分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。

下载
public boolean withdraw(double amount) {
    if (amount <= 0 || amount > balance) {
        return false; // 拒绝操作,不改状态
    }
    balance -= amount;
    return true;
}

这样调用方能明确知道操作是否成功,也便于后续扩展日志或事件通知。

转账操作为什么不能只靠两个 Account 对象互相调用

看似简单:A 调 withdraw(),B 调 deposit()。但这是两步独立操作,中间若发生异常(如网络中断、JVM 崩溃),就会出现“A 扣了钱、B 没到账”的资金丢失问题。

简易系统可用同步事务思维规避:

  • 转账方法必须定义在第三方服务类(如 BankService)中,而非任一 Account 内部
  • 先校验 A 余额充足、B 账户存在,再执行 A 扣款、B 入账——两步都在同一方法内完成
  • 如果 B 入账失败(比如目标账户被冻结),立刻对 A 执行补偿性 deposit(amount),并返回失败
  • 注意:这里没有数据库事务,所以补偿逻辑必须幂等,例如检查 A 当前余额是否已扣减,避免重复返还

main 方法里测试时容易忽略的边界情况

新手常只测“正常存 100、取 50”,但银行系统最怕边界值出错。以下几类必须覆盖:

  • deposit(-10.0) → 应抛异常或返回 false
  • withdraw(0) 和 withdraw(Double.MAX_VALUE) → 防止溢出或逻辑绕过
  • 两个账户互相转账(A→B,紧接着 B→A)→ 检查是否因锁顺序引发死锁(单线程无感,多线程会卡住)
  • 用 double 存金额 → 实际项目中应改用 BigDecimal,否则 0.1 + 0.2 ≠ 0.3,会产生分币级误差

真正上线的账户系统不会用 double,但教学演示常忽略这点,导致后期迁移到 BigDecimal 时逻辑重写成本很高。

热门AI工具

更多
小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

6895

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

362

2025.11.27

C++ 面向对象编程与设计模式实践
C++ 面向对象编程与设计模式实践

本专题整合了 C++ 面向对象编程的核心机制,涵盖类的定义与访问控制、构造函数与析构函数、拷贝语义与移动语义、继承与虚函数多态、抽象类与接口、运算符重载、友元函数等关键知识点,同时结合单例模式、工厂模式、观察者模式、策略模式等常用设计模式的 C++ 实现,帮助开发者写出结构清晰、易于维护的面向对象代码。

364

2026.04.09

Java 面向对象与核心编程机制
Java 面向对象与核心编程机制

系统讲解 Java 面向对象编程的核心知识体系,涵盖类的定义与封装、构造方法与 this/super 关键字、继承与方法重写、多态与向上向下转型、抽象类与接口的区别与设计原则、异常处理机制(try-catch-finally / 自定义异常)、泛型的类型参数与通配符、集合框架(List/Set/Map)的使用与遍历方式,帮助开发者全面掌握 Java 程序设计的核心机制与面向对象思维。

243

2026.04.17

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

4208

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

804

2025.10.23

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

120

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

60

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

60

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn