原文: https://beginnersbook.com/2013/05/encapsulation-in-java/

封装只是意味着将对象状态(字段)和行为(方法)绑定在一起。如果您正在创建类,那么您正在进行封装。在本指南中,我们将看到如何在 java 程序中进行封装,如果您正在寻找封装的真实示例,请参考本指南:使用现实示例解释的 OOP 功能。

对于其他 OOP 主题,如继承多态,请参考 OOPs 概念

让我们回到主题。

什么是封装?

封装背后的整个想法是隐藏用户的实现细节。如果数据成员是私有的,则意味着它只能在同一个类中访问。没有外部类可以访问其他类的私有数据成员(变量)。

但是,如果我们设置公共获取器和设置器方法来更新(例如void setSSN(int ssn))和读取(例如int getSSN())私有数据字段,那么外部类可以通过公共方法访问这些私有数据字段。

这样,数据只能通过公共方法访问,从而使私有字段及其实现对外部类隐藏。这就是封装被称为数据隐藏的原因。 让我们看一个例子来更好地理解这个概念。

Java 中的封装示例

如何在 java 中实现封装:

1)将实例变量设为私有,以便不能直接从类外部访问它们。您只能通过类的方法设置和获取这些变量的值。

2)在类中使用获取器和设置器方法来设置和获取字段的值。

  1. class EncapsulationDemo{
  2. private int ssn;
  3. private String empName;
  4. private int empAge;
  5. //Getter and Setter methods
  6. public int getEmpSSN(){
  7. return ssn;
  8. }
  9. public String getEmpName(){
  10. return empName;
  11. }
  12. public int getEmpAge(){
  13. return empAge;
  14. }
  15. public void setEmpAge(int newValue){
  16. empAge = newValue;
  17. }
  18. public void setEmpName(String newValue){
  19. empName = newValue;
  20. }
  21. public void setEmpSSN(int newValue){
  22. ssn = newValue;
  23. }
  24. }
  25. public class EncapsTest{
  26. public static void main(String args[]){
  27. EncapsulationDemo obj = new EncapsulationDemo();
  28. obj.setEmpName("Mario");
  29. obj.setEmpAge(32);
  30. obj.setEmpSSN(112233);
  31. System.out.println("Employee Name: " + obj.getEmpName());
  32. System.out.println("Employee SSN: " + obj.getEmpSSN());
  33. System.out.println("Employee Age: " + obj.getEmpAge());
  34. }
  35. }

输出:

  1. Employee Name: Mario
  2. Employee SSN: 112233
  3. Employee Age: 32

在上面的示例中,所有三个数据成员(或数据字段)都是私有的(请参阅: Java 中的访问修饰符),无法直接访问。这些字段只能通过公共方法访问。字段empNamessnempAge使用 OOP 的封装技术制作隐藏数据字段。

封装的优点

  1. 它提高了可维护性和灵活性以及可重用性:例如,在上面的代码中,void setEmpName(String name)String getEmpName()的实现代码可以在任何时间点改变。由于实现纯粹是为外部类隐藏的,因此它们仍将使用相同的方法(setEmpName(String name)getEmpName())访问私有字段empName。因此,可以在任何时间点维护代码,而不会破坏使用代码的类。这提高了底层类的可重用性。
  2. 这些字段可以是只读的(如果我们没有在类中定义设置器方法)或只写(如果我们没有在类中定义获取器方法)。对于例如如果我们有一个我们不想改变的字段(或变量),那么我们只需将变量定义为private而不是设置器和获取器两者,我们只需要为该变量定义获取器方法。由于设置器方法不存在,外部类无法修改该字段的值。
  3. 用户不会知道幕后发生了什么。他们只知道要更新字段调用集方法并读取字段调用获取器方法,但这些设置器和获取器 方法正在做的事情纯粹是对它们隐藏的。

封装也称为“数据隐藏”。