Appearance
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 来自动创建对象和赋值。现在先按这个规范写,后面不会踩坑。