# Java 中的封装

> 原文： [https://beginnersbook.com/2013/05/encapsulation-in-java/](https://beginnersbook.com/2013/05/encapsulation-in-java/)

封装只是意味着将对象状态（字段）和行为（方法）绑定在一起。如果您正在创建类，那么您正在进行封装。在本指南中，我们将看到如何在 java 程序中进行封装，如果您正在寻找封装的真实示例，请参考本指南：[使用现实示例](https://beginnersbook.com/2013/03/oops-in-java-encapsulation-inheritance-polymorphism-abstraction/)解释的 OOP 功能。

> 对于其他 OOP 主题，如[继承](https://beginnersbook.com/2013/03/inheritance-in-java/)和[多态](https://beginnersbook.com/2013/03/polymorphism-in-java/)，请参考 [OOPs 概念](https://beginnersbook.com/2013/04/oops-concepts/)

让我们回到主题。

## 什么是封装？

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

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

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

## Java 中的封装示例

如何在 java 中实现封装：

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

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

```java
class EncapsulationDemo{
    private int ssn;
    private String empName;
    private int empAge;

    //Getter and Setter methods
    public int getEmpSSN(){
        return ssn;
    }

    public String getEmpName(){
        return empName;
    }

    public int getEmpAge(){
        return empAge;
    }

    public void setEmpAge(int newValue){
        empAge = newValue;
    }

    public void setEmpName(String newValue){
        empName = newValue;
    }

    public void setEmpSSN(int newValue){
        ssn = newValue;
    }
}
public class EncapsTest{
    public static void main(String args[]){
         EncapsulationDemo obj = new EncapsulationDemo();
         obj.setEmpName("Mario");
         obj.setEmpAge(32);
         obj.setEmpSSN(112233);
         System.out.println("Employee Name: " + obj.getEmpName());
         System.out.println("Employee SSN: " + obj.getEmpSSN());
         System.out.println("Employee Age: " + obj.getEmpAge());
    } 
}
```

**输出：**

```java
Employee Name: Mario
Employee SSN: 112233
Employee Age: 32
```

在上面的示例中，所有三个数据成员（或数据字段）都是私有的（请参阅： [Java 中的访问修饰符](https://beginnersbook.com/2013/05/java-access-modifiers/)），无法直接访问。这些字段只能通过公共方法访问。字段`empName`，`ssn`和`empAge`使用 OOP 的封装技术制作隐藏数据字段。

## 封装的优点

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

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