封装
封装是面向对象的核心思想之一:把对象的内部数据和实现细节隐藏起来,只通过稳定的方法向外提供访问入口。
为什么需要封装
- 防止外部代码随意修改对象状态。
- 让类的内部实现可以变化,而外部调用方式保持稳定。
- 把校验逻辑集中在类内部,避免对象进入非法状态。
基本做法
- 成员变量通常使用
private修饰。 - 通过
public方法暴露必要操作。 - setter 中加入合法性校验。
- 构造方法保证对象一创建就处于合法状态。
class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
setAge(age);
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age < 0 || age > 150) {
throw new IllegalArgumentException("年龄不合法");
}
this.age = age;
}
}getter 和 setter
- getter:读取私有属性。
- setter:修改私有属性。
- 不一定每个字段都要提供 setter;不希望外部修改的字段可以只提供 getter。
封装和访问控制
封装依赖访问控制修饰符实现。常见组合是:
- 字段:
private - 构造方法:按创建需求设置为
public或限制访问 - 对外方法:
public - 类内部辅助方法:
private
和其他 OOP 概念的关系
常见误区
- 封装不是“把所有字段都写 getter/setter”,而是控制外部能做什么。
public字段会让对象状态失控,一般不推荐。- setter 不做校验,只是把字段改成
private,封装价值很低。