Java银行账户类封装的核心是私有化字段、提供带校验的公共方法、构造器强制初始化。1. 账号、姓名、余额均设为private;2. deposit/withdraw/transferTo含金额与余额校验,getBalance返回安全副本;3. 构造器校验非空、长度、非负;4. 可选防御性拷贝与trim处理。

在 Java 中,利用封装思想实现安全的银行账户类,核心是隐藏内部数据、限制直接访问、通过受控方法操作状态。关键不是“把字段设成 private 就完事”,而是围绕业务规则设计合理的访问边界和校验逻辑。
1. 私有化核心字段,禁止外部直接读写
账户余额、账号、户主姓名等敏感信息必须声明为 private,杜绝外部代码用点号随意修改或读取:
-
private String accountNumber;(账号不可被外部篡改) -
private String ownerName;(姓名只在创建时设定) -
private double balance;(余额绝不允许直接赋值)
2. 提供有校验的公共操作方法,而非简单 getter/setter
不暴露 setter 给余额,也不让 getter 返回可变对象引用。转账、取款、存款都应是带逻辑的方法:
-
deposit(double amount):检查金额是否 > 0,再累加 -
withdraw(double amount):先判断余额是否充足,再扣减 -
transferTo(BankAccount target, double amount):双账户协同操作,加锁或事务语义(基础版可先做余额校验+扣减+入账) -
getBalance():只返回 副本值(double 是基本类型,天然安全;若用 BigDecimal 则需 new BigDecimal(balance) 防止外部修改)
3. 构造器强制初始化,拒绝无效对象
账号和户主名不能为空,初始余额不能为负。构造器中做参数校验,抛出 IllegalArgumentException:
立即学习“Java免费学习笔记(深入)”;
- 检查
accountNumber != null && !accountNumber.trim().isEmpty() - 检查
ownerName != null && ownerName.trim().length() >= 2 - 检查
initialBalance >= 0
4. 可选增强:使用不可变属性与防御性拷贝
若账号字符串可能被外部持有并修改(虽然 String 本身不可变),更严谨的做法是存储其副本:this.accountNumber = accountNumber == null ? null : accountNumber.trim();。对返回的账号、姓名等也建议返回 trim 后副本,避免空格干扰后续比对。
封装不是自我封闭,而是用方法定义“谁可以做什么、在什么条件下做”。一个真正安全的银行账户类,让人只能通过你允许的方式存、取、转——哪怕他手握对象引用,也无法绕过规则。


















