【Java专题】类的封装

封装(encapsulation)是面向对象编程中的一个重要概念,它指的是将数据和操作数据的方法绑定在一起,并且隐藏对象的内部实现细节,只暴露必要的接口给外部使用。通过封装,可以提高代码的安全性、可维护性和可重用性。

封装的实现

在Java中,封装通常通过以下方式实现:

  • 将类的成员变量声明为私有(private),只能在类的内部访问
  • 提供公共(public)的 getter 和 setter 方法来访问和修改成员变量的值
  • 可以在 getter 和 setter 方法中添加逻辑来控制对成员变量的访问,例如验证输入数据的合法性、计算衍生属性等
  • 可以使用访问修饰符来控制类的访问权限,例如将类声明为 public 或者 package-private
  • 可以使用 final 关键字来防止类被继承或者方法被重写,从而保护类的封装性

高内聚低耦合是面向对象设计的一个重要原则,封装有助于实现高内聚和低耦合。高内聚指的是一个类应该只负责一件事情,具有单一的职责,这样可以提高类的可维护性和可重用性。低耦合指的是一个类应该尽量减少对其他类的依赖,这样可以提高系统的灵活性和可扩展性。

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package study.ghr.pk1;

public class TestEncapsulation {
private String name;
private int age;

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) {
this.age = age;
} else {
System.out.println("invalid age: " + age);
}
}
}

class TestEncapsulationMain {
public static void main(String[] args) {
TestEncapsulation t = new TestEncapsulation();
// t.name; // 直接获取private属性会报错
// t.age; // 直接获取private属性会报错
t.setName("Zhang san"); // 通过setter方法可以正常修改
t.setAge(20); // 通过setter方法可以正常修改
System.out.println("name: " + t.getName() + ", age: " + t.getAge()); // name: Zhang san, age: 20
t.setAge(-1); // invalid age: -1
}
}