Java封装的核心概念
封装指的是将对象的属性(数据)和行为(方法)包装在一起,隐藏对象内部的实现细节,只对外暴露有限的访问接口。在Java中,封装的核心目标是实现数据保护,避免外部代码随意修改对象的内部状态,减少代码耦合度,提升程序的可维护性。

访问控制修饰符的作用
Java通过访问控制修饰符来限制类、属性、方法的访问范围,这是实现封装的基础。常用的访问控制修饰符有四个,各自的访问权限如下:
| 修饰符 | 同一个类 | 同一个包 | 子类 | 不同包 |
|---|---|---|---|---|
| private | 可访问 | 不可访问 | 不可访问 | 不可访问 |
| default(默认,不写修饰符) | 可访问 | 可访问 | 不可访问 | 不可访问 |
| protected | 可访问 | 可访问 | 可访问 | 不可访问 |
| public | 可访问 | 可访问 | 可访问 | 可访问 |
要实现严格的数据保护,最常用的修饰符是private,它可以将属性限制在类的内部访问,外部无法直接操作。
私有属性与公共访问方法的配合
将属性声明为private之后,外部无法直接读取或修改属性值,此时需要为属性提供公共的访问方法,也就是常说的getter和setter方法。我们可以在方法中添加校验逻辑,进一步控制数据的修改规则。
以下是一个用户类的封装示例:
public class User {
// 私有属性,外部无法直接访问
private String name;
private int age;
// 公共的getter方法,用于获取name属性
public String getName() {
return name;
}
// 公共的setter方法,用于设置name属性,可添加校验逻辑
public void setName(String name) {
if (name == null || name.trim().isEmpty()) {
throw new IllegalArgumentException("用户名不能为空");
}
this.name = name;
}
// 公共的getter方法,用于获取age属性
public int getAge() {
return age;
}
// 公共的setter方法,用于设置age属性,添加年龄合法性校验
public void setAge(int age) {
if (age < 0 || age > 150) {
throw new IllegalArgumentException("年龄必须在0到150之间");
}
this.age = age;
}
}
在上面的代码中,name和age属性被声明为private,外部无法直接通过user.name的方式访问。如果外部想要修改年龄,必须调用setAge方法,而方法内部会校验年龄的合法性,避免设置无效的年龄值。
封装的额外实践技巧
- 如果属性是只读的,不需要提供
setter方法,只保留getter方法即可,比如用户的唯一ID属性,生成之后不应该被修改。 - 如果属性是常量,可以使用
private static final修饰,进一步限制其不可变性。 - 对于返回可变对象引用的
getter方法,需要注意避免外部修改内部对象的状态,比如返回集合时,可以返回一个不可修改的副本。
以下是一个只读属性的示例:
public class Order {
// 只读属性,只有getter方法,没有setter方法
private final String orderId;
public Order(String orderId) {
this.orderId = orderId;
}
public String getOrderId() {
return orderId;
}
}
封装对数据保护的意义
通过封装实现数据保护之后,对象内部的状态变化完全由类自身控制,外部代码不需要了解对象内部的实现细节,只需要通过暴露的接口交互。当后续需要修改内部属性的存储方式或者校验逻辑时,只需要修改类内部的方法,不会影响外部调用方的代码,大幅降低了代码的维护成本,也减少了因外部随意修改数据导致的程序异常问题。
Java封装数据保护privategetter_setter修改时间:2026-06-27 19:15:25