Java数据封装是通过private修饰字段、提供带校验的getter/setter、返回可变对象副本及使用final修饰不可变字段,实现对外隐藏细节、控制数据访问与修改。

Java数据封装就是把类的属性和方法打包成一个“黑盒”,对外隐藏内部细节,只留安全可控的入口。核心不是不让别人用,而是不让别人乱改——数据得通过你定的规则来读、来写。
用private锁住字段,切断直接访问
这是封装的第一道防线。把字段声明为private,外部类连点都点不到它,编译直接报错。
- 比如private String name;和private int age;,外部代码写user.name = "张三"会失败
- 子类也不能直接访问,彻底隔绝随意修改的风险
用getter/setter提供受控通道
字段私有化后,必须靠公共方法来桥接。getter负责读,setter负责写,关键在setter里能加校验逻辑。
- public String getName() { return name; }——简单返回,通常不校验
- public void setAge(int age) { if (age 150) throw new IllegalArgumentException("年龄非法"); this.age = age; }——写之前先拦住坏数据
防坑:别把可变对象的引用直接交出去
如果字段是List、数组这类可变类型,getter若直接return原始引用,外部就能绕过setter偷偷改内部状态。
立即学习“Java免费学习笔记(深入)”;
- 错例:public List
getHobbies() { return hobbies; } ——外部调用list.add("游泳")就破坏了封装 - 正解:public List
getHobbies() { return new ArrayList(hobbies); } ——返回副本,原件稳如泰山
用final加固不可变字段
有些数据一旦设定就不该变(比如用户ID、创建时间),用final修饰,强制在构造时初始化,之后无法重赋值。
- private final String userId;
- 构造方法里必须赋值:this.userId = generateId();
- 既保障状态稳定,也天然支持线程安全
基本上就这些。不复杂但容易忽略细节。










