封装的核心是控制访问而非禁止访问,通过private字段与public的getter/setter实现逻辑校验、行为隐藏和内部可替换性,提升解耦与可维护性。

Java 通过封装将对象的属性设为 private,仅提供 public 的 getter/setter 方法来间接访问,从而隐藏内部实现细节。核心不是“不让人看”,而是“控制怎么被使用”。
用 private 修饰成员变量
这是封装的第一步。把字段声明为 private,外部类就无法直接读写,强制走可控入口。
- 例如:
private String name;外部不能写obj.name = "Alice"; - 即使子类也不能直接访问(除非用反射,但那是绕过封装,非正常路径)
提供有逻辑的 getter 和 setter 方法
方法是 public 的,但内部可以加校验、转换、日志等——这些就是“隐藏的实现”。用户只关心“能取值/设值”,不关心你怎么存、怎么验。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 比如
setAge(int age)内部可判断if (age 150) throw new IllegalArgumentException(); -
getName()可以返回拼接后的格式:return "Mr. " + name;,调用方完全无感知 - 甚至字段本身可以不存在:比如
getFullName()可能拼接firstName和lastName,外部以为是个字段,其实没这个变量
内部实现可随时替换,对外透明
只要方法签名不变,内部怎么改都不影响使用者。这才是封装真正带来的好处——解耦和可维护性。
立即学习“Java免费学习笔记(深入)”;
- 原来用
private List<string> tags = new ArrayList();</string>,后来换成private Set<string> tags = new HashSet();</string>?只要addTag()、getTags()行为一致,调用方代码完全不用动 - 缓存逻辑、数据库查询、远程调用……都可以藏在 getter 里,外部只看到“取数据”,看不见 IO 或计算
必要时用包级私有或 final 进一步约束
如果类只在本包内使用,可以把方法设为 package-private(不写修饰符);对不可变对象,字段用 final + 只提供 getter,彻底禁止修改。
-
private final LocalDate createdAt = LocalDate.now();—— 创建后就不能变,也不提供 setter - 工具类常用
private static final常量 + 静态方法,也是封装的一种体现

















