封装

封装是面向对象的核心思想之一:把对象的内部数据和实现细节隐藏起来,只通过稳定的方法向外提供访问入口。

为什么需要封装

  • 防止外部代码随意修改对象状态。
  • 让类的内部实现可以变化,而外部调用方式保持稳定。
  • 把校验逻辑集中在类内部,避免对象进入非法状态。

基本做法

  1. 成员变量通常使用 private 修饰。
  2. 通过 public 方法暴露必要操作。
  3. setter 中加入合法性校验。
  4. 构造方法保证对象一创建就处于合法状态。
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 概念的关系

  • 类与对象:封装让对象成为“有边界的整体”。
  • 子类与继承:父类可通过 protected 给子类保留扩展点。
  • 多态:调用者只依赖公开方法,不关心具体实现。

常见误区

  • 封装不是“把所有字段都写 getter/setter”,而是控制外部能做什么。
  • public 字段会让对象状态失控,一般不推荐。
  • setter 不做校验,只是把字段改成 private,封装价值很低。