Java封装的核心是权限隔离与接口抽象:用private封禁字段,仅通过public方法提供受控接口,嵌入校验逻辑,并隐藏内部结构与实现细节。

Java 中封装隐藏实现细节、只暴露公共接口,关键在于“权限隔离 + 接口抽象”。不是靠加密或混淆,而是用语言机制强制限制访问路径,让外部只能走你设计好的门。
用 private 封死内部数据
把字段(属性)全部声明为 private,这是最基础也最关键的一步。一旦加了 private,连同包的其他类、子类、外部项目都完全无法直接读写这个变量。
- 比如
private String idCard;—— 外部连“有没有这张身份证”都看不到,更别说读取号码或篡改 - 即使内部用 int 存性别(0/1),外部也接触不到这个数字,只能通过你提供的
getGender()得到 “男” 或 “女” 字符串 - 字段私有后,类就拥有了对数据的绝对控制权:可以延迟加载、动态计算、加锁、打日志,外部毫无感知
用 public 方法定义唯一入口
所有对外能力必须通过 public 方法 提供,这些方法就是你允许别人使用的“接口”。它们不暴露怎么做的,只承诺能做什么。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
public double getFinalScore()可能内部调用了加权算法、缓存逻辑、数据库查询,但调用方只需知道“它返回最终成绩” -
public void submitOrder(Order order)可能包含库存校验、支付预扣、消息推送,但使用者不用管顺序和异常分支 - 构造器也是接口的一部分:
public BankAccount(String owner, BigDecimal initBalance)约束了对象必须怎么创建,避免出现余额为负的非法实例
在接口里嵌入校验与转换逻辑
getter/setter 不是透明管道,而是可控闸门。你在方法体内加入业务规则,就能把非法状态挡在类外面。
立即学习“Java免费学习笔记(深入)”;
-
setAge(int age)里判断if (age 150),直接拒绝错误值,而不是等出错再抛异常 -
getName()返回前做return name == null ? "" : name.trim();,统一处理空值,调用方永远拿到干净字符串 - 内部字段可以是
private LocalDateTime lastLogin;,但对外只提供public String getLastLoginDate()返回格式化后的日期字符串,隐藏时区、存储精度等细节
不暴露内部结构和依赖
封装还体现在不把实现用到的类、集合类型、算法选择等泄露出去。外部只认接口契约,不认具体实现。
- 返回
List<User>而不是ArrayList<User>,这样以后换成LinkedList或自定义集合,调用方代码完全不用改 - 方法参数用接口类型:
public void process(DataSource source),而不是FileDataSource或DbDataSource,方便后期替换数据源 - 内部用
Map<String, CacheEntry>做缓存,但不提供getCacheMap()这种方法——缓存只是手段,不是功能,不该被外部操作

















