# Java 中的抽象示例

> 原文： [https://howtodoinjava.com/oops/understanding-abstraction-in-java/](https://howtodoinjava.com/oops/understanding-abstraction-in-java/)

用最简单的话来说，您可以将抽象定义为仅捕获与当前视角相关的 Java 对象的那些细节。

例如，`HashMap`存储键值对。 它为您提供了两种方法`get()`和`put()`方法，用于从映射存储和检索键值对。 实际上，这是您想要在应用程序中使用映射时所需的唯一信息。 它是如何工作的，不需要使用它就知道。 这是 Java 中非常抽象的示例。

再看一个**现实生活中的抽象示例**，它可以是电视遥控器。 您知道，当您按遥控器上的任何按钮时，电视上都会应用某些功能，例如更改频道，更改音量级别等。不需要了解远程内部的工作原理，即可正确使用它。 这是一个抽象的例子。

```java
Table of Contents

1\. What is abstraction in oops?
2\. Types of abstraction
3\. How to use abstraction in java
4\. Encapsulation vs Abstraction

```

## 1\. OOP 中的抽象是什么？

在[面向对象程序设计](//howtodoinjava.com/object-oriented/object-oriented-principles/)理论中，抽象涉及**定义对象的能力**，该对象代表可以执行工作，报告和更改其状态以及与系统中其他对象“通信”的抽象“角色”。

> 在计算机科学中，抽象是这样的过程，在该过程中，数据和程序以与其含义（语义学）形式相似的表示形式进行定义，同时隐藏了实现细节。 – [WikiPedia](https://en.wikipedia.org/wiki/Abstraction_%28computer_science%29 "Abstraction")

任何编程语言中的抽象都可以通过多种方式工作。 从创建子例程到定义用于进行低级语言调用的接口可以看出。

一些抽象试图通过完全隐藏它们依次建立在其上的抽象来限制程序员所需概念的广度，也就是[设计模式](//howtodoinjava.com/gang-of-four-java-design-patterns/)。

## 2\. 抽象类型

通常，可以通过两种方式查看抽象：

1.  #### 数据抽象

    数据抽象是创建复杂数据类型并仅公开有意义的操作以与数据类型进行交互的方式，而将所有实现细节都隐藏在外部工作中。

    这种方法的好处在于可以随着时间的流逝改善实现的能力，例如解决性能问题无所不包。 想法是这样的更改不应该对客户端代码产生任何影响，因为它们在抽象行为上没有任何区别。

2.  #### 控制抽象

    软件本质上是用任何编程语言编写的众多语句的集合。 在大多数情况下，语句是相似的，并且多次重复出现。

    控制抽象是识别所有此类语句并将其作为工作单元公开的过程。 我们通常在创建函数来执行任何工作时使用此特性。

## 3\. 如何用 Java 实现抽象？

由于抽象是面向对象编程实践的核心原则之一，而 Java 遵循所有 OOP 原则，因此抽象是 Java 语言的主要构建模块之一。

**在 Java 中，抽象是通过接口和抽象类实现的**。接口允许您完全抽象化实现，而抽象类也允许部分抽象。

***数据抽象***从创建简单数据对象到复杂的集合实现，例如[`HashMap`](//howtodoinjava.com/java/collections/how-hashmap-works-in-java/)或`HashSet`。

同样，从定义简单的函数调用到完整的开源框架，可以看出***控制抽象***。 控制抽象是[结构化编程](https://en.wikipedia.org/wiki/Structured_programming "Structured programming")背后的主要力量。

#### 3.1 Java 抽象示例

我们再来看一个 Java **使用接口**进行抽象的示例。 在此示例中，我将创建各种报告，这些报告可以在应用程序生存期内随时按需运行。 作为报告的使用者，类不必知道报告的内部`run()`，只需要执行此方法即可执行报告。

```java
import java.util.List;

public interface Report 
{
    List<Object> run(ReportContext reportContext);
}

```

```java
public class ReportContext {
	//fields
}

```

```java
import java.util.List;

public class EmployeeReport implements Report 
{
    @Override
    public List<Object> run(ReportContext reportContext) {
        //Custom Logic
        System.out.println("Executing employee report");
        return null;
    }
}

```

```java
import java.util.List;

public class SalaryReport implements Report 
{
    @Override
    public List<Object> run(ReportContext reportContext) {
        //Custom logic
        System.out.println("Executing salary report");
        return null;
    }
}

```

现在使用`run()`方法执行报告。

```java
package com.howtodoinjava.abstraction;

public class Main {
    public static void main(String[] args) {

        ReportContext reportContext = new ReportContext();
        //Populate context

        Report eReport = new EmployeeReport();
        eReport.run(reportContext);

        Report sReport = new EmployeeReport();
        sReport.run(reportContext);
    }
}

```

程序输出。

```java
Executing employee report
Executing employee report

```

## 4\. 封装与抽象

> `Encapsulation`是您所需的`abstraction`的实现。

抽象更多地是关于隐藏实现细节。 在 Java 中，抽象是通过抽象类和接口实现的。

封装是将实现（代码）及其操作的数据（变量）包装在同一类中。 Java 类是封装类的一个示例，其中所有实例变量都是私有的，并且只有该类中的方法才能操纵这些变量。

如果您想了解有关 Java 中抽象类和接口的更多信息，请阅读我的下一篇文章[探索 Java](//howtodoinjava.com/object-oriented/exploring-interfaces-and-abstract-classes-in-java/ "Exploring interfaces and abstract classes in java") 中的接口和抽象类。

学习愉快！