# Java 封装与抽象

> 原文： [https://howtodoinjava.com/oops/encapsulation-in-java-and-its-relation-with-abstraction/](https://howtodoinjava.com/oops/encapsulation-in-java-and-its-relation-with-abstraction/)

你们中的大多数人都同意封装和抽象在一起会带来很多混乱。 大多数博客只会进一步增加混乱。 让我们解决这个难题。

在上一篇文章“[了解 Java 中的抽象](//howtodoinjava.com/object-oriented/understanding-abstraction-in-java/ "Understanding abstraction in java")”之后，我开始撰写此文章。 我的目标是了解 Java 中的封装及其与抽象的关系。 一开始，我就开始陷入前所未有的混乱之中。 在浏览了多个小时并阅读了一些写得很好以及令人困惑的博客条目之后，我能够做出一些清晰的理解。 跟随我的足迹

```java
Table of Contents

Encapsulation in simple words
Encapsulation in Detail
Encapsulation vs Abstraction
```

## 简单的封装

将类中的数据和方法与实现隐藏（通过访问控制）结合起来通常称为封装。 结果是具有特征和行为的数据类型。 **封装实质上具有信息隐藏和实现隐藏两者。**

## 详细封装

我在某处读过它：“**进行任何更改，将其封装**”。 它被引用为著名的设计原则。 因此，在任何类中，运行时中的数据都可能发生更改，将来的发行版中可能会更改实现。 因此，封装既适用于数据也适用于实现。

访问控制或实现隐藏将边界置于数据类型或类中，这有两个重要原因。 首先是确定客户端程序员可以使用和不能使用的东西。 这直接导致了第二个原因，那就是将接口与实现分开。

如果您确定客户端程序员除了将消息发送到公共接口之外什么也不能做，那么您可以随意更改不公开的任何内容（例如，包访问，受保护或私有），而不会破坏客户端代码。 封装可以帮助您实现这一保证。

## 封装与抽象

如果您读完了[上一篇](//howtodoinjava.com/object-oriented/understanding-abstraction-in-java/ "Understanding abstraction in java")，您将看到抽象本质上是一个主意，这有助于设置指导原则。 封装是我们实现所需抽象的机制。

简而言之，从 OOAD 的角度来看：

*   抽象更多地涉及“**类可以做什么**”。(**想法**)
*   封装更多地涉及“**如何**”来实现该功能。(**实现**)

我在很多博客上都看到了与此理论相矛盾的地方。 因此，如果您也不同意这一点，请多多包涵。 另外，我将要求您对与主题相关的想法发表评论。 我会很乐意尝试联系或否定。

展望未来，我将以我们众所周知的类[`HashMap`](//howtodoinjava.com/java/collections/how-hashmap-works-in-java/)为例。 此类负责存储键值对，基于键进行搜索并执行更多操作。 从外部，客户端代码仅知道方法名称及其行为。 它调用了这些方法，并快乐地生活着。 这实际上是抽象准则。 抽象表示，客户端代码应调用添加键值对的方法，基于键检索值的方法等。 应该怎么做？ 不是抽象业务。

当您开始编写实际代码时，封装就到了。 您编写`HashMap.Entry`类，并创建类型为`Entry[]`的变量*表*。 然后，您将所有此类内容声明为私有，并仅允许`put()`和`get()`方法等公共访问。这实际上是封装。 *您所需的抽象*的实现。

希望您更加清楚 **Java 封装**，以及**与抽象**的区别。

学习愉快！