Skip to content

2026-08-27 · 隐藏内部细节,只暴露必要的接口——数据安全的第一道防线。

Java 封装

1. 封装思想

封装的核心原则:属性私有化,通过方法访问

不封装的问题:

java
public class Student {
    String name;
    int age;
}

Student s = new Student();
s.age = -200; // ❌ 直接赋值,没人拦得住,数据不合法

封装后:

java
public class Student {
    private String name;  // 私有属性,外部不能直接访问
    private int age;

    // 提供 public 的 getter/setter 方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age < 0 || age > 150) {
            System.out.println("年龄不合法");
            return;
        }
        this.age = age;
    }
}

// 使用
Student s = new Student();
s.setAge(-200);  // 输出:年龄不合法(被拦住了)
s.setAge(20);    // ✅ 正常赋值
System.out.println(s.getAge()); // 20

封装不是"不让访问",而是"通过方法访问,在方法里加校验逻辑"。

2. 权限修饰符

四种修饰符,控制谁能访问:

修饰符同一个类同一个包子类任何地方
private
默认(不写)
protected
public

使用场景

  • private:属性(成员变量)—— 最常用,属性全用 private
  • 默认:工具类的内部实现 —— 不需要被其他包访问
  • protected:父类方法/属性,希望子类能继承 —— 继承时再细讲
  • public:对外暴露的 API(方法)—— 调用者需要能访问
java
public class Student {
    private String name;     // 只有本类能访问
    int age;                 // 同一个包内能访问
    protected String school; // 子类也能访问
    public void study() {}   // 任何地方都能访问
}

记忆:从上到下,访问范围越来越大。属性用 private,方法用 public,是日常开发的默认选择。

3. getter/setter 规范

标准写法:

java
public class Student {
    private String name;
    private int age;

    // getter:属性名首字母大写 + get 前缀
    public String getName() {
        return name;
    }

    // setter:属性名首字母大写 + set 前缀
    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age < 0 || age > 150) {
            throw new IllegalArgumentException("年龄不合法");
        }
        this.age = age;
    }
}

boolean 类型的 getter 特殊

java
private boolean active;

public boolean isActive() {  // 不是 getActive()
    return active;
}

public void setActive(boolean active) {
    this.active = active;
}

IDEA 里可以自动生成 getter/setter:右键 → Generate → Getter and Setter,选属性即可。

4. JavaBean 规范

符合规范的类,方便框架(Spring、MyBatis 等)自动处理:

java
public class Student {
    private String name;
    private int age;

    // 1. 无参构造(必须!)
    public Student() {}

    // 2. 有参构造(可选)
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 3. getter/setter
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
}

以后学 Spring 时会发现:框架需要无参构造 + getter/setter 来自动创建对象和赋值。现在先按这个规范写,后面不会踩坑。