java中封装的核心是:用private隐藏字段,强制所有交互通过public方法进行,并借助访问控制划定边界;字段不可直连,方法定义契约,内部实现可自由变更而不影响调用方。

Java 中通过封装隐藏内部实现细节、只暴露必要接口,核心就一条:不让外部直接碰字段,所有交互必须走方法,并用访问控制划清边界。
用 private 封死字段,切断直连通道
把所有属性(如 name、balance、password)声明为 private,这是最基础也最关键的一步。外部代码连编译都过不了,更别说运行时修改了。
- 字段名、类型、是否拆分(比如把 String address 拆成 street + city)全可随时调整,只要 getter 行为不变,调用方完全无感
- 敏感数据如身份证号、密码、余额等,天然隔绝非法赋值,比如 account.balance = -1000 直接报错
- 内部辅助类(如 private static class TokenGenerator)和私有工具方法(如 private String hashPassword())也不会泄露出去
用 public 方法定义契约,而非搬运数据
getter/setter 不是“字段的马甲”,而是对外承诺的行为接口。它决定“能做什么”,不暴露“怎么做”。
- setAge(int age) 可校验范围、自动修正或抛异常,调用方不用重复写 if (age
- getFullName() 可拼接 firstName + lastName,也可从数据库查缓存,甚至返回 "李*明" 脱敏结果
- 方法体内可加日志、监控埋点、懒加载、线程安全包装,全部对调用方透明
集合与状态要防篡改,只给“快照”不给“钥匙”
内部用 ArrayList 存订单列表?没问题。但返回时别直接 return orders;否则外部可能 orders.add() 或 clear(),破坏对象一致性。
- 用 Collections.unmodifiableList(orders) 返回只读视图
- 只读字段(如 id、createTime)只提供 getter,不写 setter;必要时加 final 修饰
- 状态变更走语义化方法:调用 confirmOrder() 而不是直接 status = "CONFIRMED",内部可校验前置条件、更新时间戳、发消息
用接口进一步抽象行为,彻底解耦实现
当多个实现共存(比如微信支付、支付宝支付),就不要让业务代码依赖具体类,而应面向接口编程。
- 定义 public interface PaymentProcessor { void pay(BigDecimal amount); }
- WechatPayImpl 和 AlipayImpl 都实现该接口,内部算法、签名方式、回调处理全可不同
- 上层只依赖 PaymentProcessor,注入哪个实现由配置或工厂决定,替换支付渠道不改一行业务逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











