章
目
录
在Java中,抽象仅捕获与当前上下文相关的类细节。例如,java.util.Map存储键值对,并公开两个方法get()和put()来存储和检索键值对。实际上,这是我们在想要在应用程序中使用Map时唯一需要的信息。关于Map内部如何工作,我们并不需要了解就能使用它。这在Java中非常典型的是抽象的例子。
再举一个更贴近生活的抽象例子,可以是电视遥控器。你知道当你在遥控器上按下任何按钮时,会在电视上执行某些功能,比如更改频道、调整音量等。你不需要知道遥控器内部的工作原理,就能正确地使用它。这是一个抽象的例子。
1. OOP 中的抽象?
在面向对象的编程理论中,抽象涉及定义代表抽象“参与者”的对象,这些对象可以执行工作,报告并更改其状态,并与系统中的其他对象“通信”。
任何编程语言中的抽象都有多种方式。从创建子程序到定义进行低级语言调用的接口都可以看出。
一些抽象试图通过完全隐藏它们所构建的抽象(例如设计模式)来限制程序员所需概念的广度。
2. 抽象类型
通常抽象可以通过两种方式来看待:
- 数据抽象
- 控制抽象
2.1. 数据抽象
数据抽象是创建复杂数据类型并仅公开有意义的操作以与数据类型交互,同时对外部工作隐藏所有实现细节的方法。
这种方法的好处在于能够随着时间的推移改进实施,例如解决性能问题(如果有)。这个想法是,此类更改不应影响客户端代码,因为它们不涉及抽象行为的差异。
2.2. 控制抽象
任何软件由许多语句组成,这些语句是用任何编程语言编写的。大多数情况下,语句是相似的,并且在多个地方重复出现。
控制抽象是识别所有这些语句并将其公开为一个工作单元的过程。当我们创建执行任何工作的函数时,通常会使用此功能。
3. Java中如何实现抽象?
由于抽象是面向对象编程实践的核心原则之一,并且 Java 遵循所有 OOP 原则,因此抽象是 Java 语言的主要构建块之一。
在Java中,抽象是通过接口和抽象类来实现的。接口允许您完全抽象实现,而抽象类也允许部分抽象。
- 数据抽象涵盖从创建简单的数据对象到复杂的集合实现(例如HashMap或
HashSet
. - 同样,控制抽象可以从定义简单的函数调用到完整的开源框架来看。控制抽象是结构化编程背后的主要力量。
3.1. 使用接口进行抽象
让我们看看Java 中使用接口进行抽象的又一个示例。在此示例中,我创建了各种报告,这些报告可以在应用程序的生命周期内随时按需运行。作为报表的使用者,类不需要知道报表 run() 的内部结构,它只需要执行这个方法,报表就会被执行。
public interface Report {
List<Object> run(ReportContext reportContext);
}
public class ReportContext {
//属性
}
public class EmployeeReport implements Report {
@Override
public List<Object> run(ReportContext reportContext) {
//自定义逻辑
System.out.println("执行员工汇报");
return null;
}
}
public class SalaryReport implements Report {
@Override
public List<Object> run(ReportContext reportContext) {
//自定义逻辑
System.out.println("执行工资汇报");
return null;
}
}
现在用方法执行报告run()
。
public class Main {
public static void main(String[] args) {
ReportContext reportContext = new ReportContext();
//给reportContext赋值
Report eReport = new EmployeeReport();
eReport.run(reportContext);
Report sReport = new SalaryReport();
sReport.run(reportContext);
}
}
程序输出:
执行员工汇报
执行工资汇报
4. 封装和抽象的区别
封装是对所需抽象的实现
抽象更多的是隐藏实现细节。在Java中,抽象是通过抽象类和接口来实现的。
封装是将实现(代码)及其操作的数据(变量)包装在同一个类中。Java 类是封装类的一个示例,其中所有实例变量都是私有的,并且只有类中的方法可以操作这些变量。
文章目录前言 第1章 Java语言基础 第2章 流程控制语句 第3章 面向对象编程 第4章 Java 字符串 […]