Java中的抽象

2025年9月11日 | 阅读 6 分钟

在 Java 中,抽象是隐藏实现细节,只向用户公开必要的功能或特性的过程。它强调对象“做什么”而不是“如何做”。

抽象的特点

  • 抽象只突出显示基本特征,隐藏复杂的细节。
  • 抽象类可以包含没有实现的方法,需要由子类来实现。
  • 由于抽象的原则,依赖于它的代码保持不受影响。
  • 实现上的更改不会影响类的外部使用。
  • 它限制了对实现细节的直接访问,确保了更高的安全性和模块化。
  • 它通过最小化组件之间的依赖关系来促进松耦合,从而使系统更具可扩展性。
  • 它避免了代码重复。

抽象的实际例子

ATM 机:当我们使用 ATM 时,我们与一个简单的界面交互——输入 PIN,选择选项,然后取款。但我们看不到复杂的后端流程,比如身份验证、交易验证以及与银行服务器的通信。内部工作原理对用户是完全隐藏的。

汽车驾驶:当我们驾驶汽车时,我们会使用方向盘、油门和刹车,而不知道发动机、变速箱和制动系统内部如何工作的错综复杂的细节。汽车抽象化了复杂性,让我们专注于驾驶。

实现抽象

在 Java 中,可以通过以下两种方式实现抽象:

  1. 使用抽象类(用于部分抽象)
  2. 使用接口(用于 100% 抽象)

1) 使用抽象类

抽象类是不能直接实例化的类。它充当其他类的蓝图。我们使用 **abstract** 关键字定义抽象类。

要记住的重要事项

  • 抽象类是用 **abstract** 关键字声明的类。
  • 抽象方法是没有 **实现** 的方法。
  • 抽象类可以同时包含 **抽象方法** 和 **具体方法**(即有实现的)。
  • 父类为抽象类的子类必须实现抽象方法。如果子类无法提供实现,则必须将其声明为 **abstract**。
  • 任何包含一个或多个抽象方法的类都必须声明为 **abstract**。
  • 在 Java 中不允许 **实例化** 抽象类。换句话说,不能使用 new 关键字创建抽象类的对象。
  • 如果没有提供构造函数,抽象类有一个 **默认构造函数**。抽象类也可以包含 **用户定义的构造函数**。
  • 允许在抽象类中创建多个构造函数。

阅读更多 Java 中的抽象类

语法

抽象方法

抽象方法是没有方法体的方法,必须由子类实现。

要了解更多,请访问 Java 中的抽象方法

语法

抽象类的示例

示例

立即执行

输出

Bark bark
I can eat.

要了解更多,请访问 Java 抽象类和方法

何时使用抽象类?

我们应该使用抽象类和抽象方法来为多个相关类定义一个通用蓝图,同时实现特定的功能。

我们应该在以下情况下使用 **抽象类**。

  • 如果多个相关类共享通用功能,抽象类可以提供默认实现。
  • 当我们希望提供一些已实现的但其他方法留给子类实现时。
  • 如果程序设计遵循基于继承的设计,并且有 **“是一个”** (IS-A)关系。例如,Person 是 Father 和 Son 的超类。
  • 它通过集中共享逻辑来帮助避免代码重复。

我们应该在以下情况下使用 **抽象方法**。

  • 如果所有子类都需要特定功能,则将其定义为抽象方法。
  • 抽象方法确保其实现将在子类中提供。
  • 使各种子类能够以独特的方式实现该方法,同时保持一致性。

2) 使用接口

在 Java 中,实现抽象的另一种方式是使用接口。接口对于实现 100% 抽象非常有用。在 Java 以及其他语言中,接口包含变量和方法,但不提供方法体。

因此,子类必须实现接口的每个方法。通过接口也可以实现多重继承。请注意,接口中的方法默认是 public 和 abstract 的。

要了解更多,请访问 Java 中的接口

在以下代码片段中,Bike 类实现了 Drivable 接口,并包含 drive() 方法。

使用接口实现抽象的示例

示例

立即执行

输出

This is the display method of the student class
This is the display method of the lecturer class

抽象的优点

  • 通过隐藏实现细节,抽象使复杂的系统更容易理解。
  • 抽象使系统的各个组件保持分离。
  • 使用抽象可以更有效地进行代码维护。
  • 抽象通过仅向用户显示必要的信息来增强安全性。

抽象的缺点

  • 如果过度使用,抽象可能会增加不必要的复杂性。
  • 使用抽象可能会降低实现的灵活性。
  • 抽象可能会使不熟悉的用户更难理解系统和调试。
  • 性能可能会受到抽象层的影响。

要避免的常见错误

以下是处理抽象时可能发生的常见错误列表,应予以避免:

  • 确保在具体子类中实现了抽象方法。
  • 避免在不需要时将所有内容都抽象化。仅在增强设计时使用抽象。
  • 覆盖抽象方法时,请确保方法签名完全匹配;否则,可能会导致错误。

最佳实践

  • 需要通用基类并共享功能时,使用抽象类。
  • 需要完全抽象或多重继承时,使用接口。
  • 保持接口小巧且专注;切勿在单个接口中包含不相关的​​方法。

结论

Java 抽象是一种重要的机制,通过向开发人员展示对象的关键方面来管理面向对象编程的固有复杂性。通过抽象类和接口,可以创建可移植、可重用且复杂性降低的系统。

Java 抽象选择题

1. 哪个关键字用于创建抽象类?

  1. abstract
  2. assert
  3. native
  4. private
 

答案 1)

解释:Java 中的 abstract 关键字用于声明抽象类。


2. 如何在 Java 中实现抽象?

  1. 仅通过抽象方法
  2. 仅通过抽象类
  3. 仅通过接口
  4. 2 和 3 均可
 

答案 4)

解释:Java 中的抽象可以通过抽象类和接口来实现。使用接口,我们可以实现 100% 的抽象。


3. 抽象类可以包含 __________?

  1. 仅默认方法
  2. 仅抽象方法
  3. 仅具体方法
  4. 2 和 3 均可
 

答案 4)

解释:抽象类可以包含 **抽象方法**(没有实现)和 **具体方法**(有实现)。


4. 抽象的主要目标是什么?

  1. 展示实现
  2. 展示基本特征
  3. 展示复杂功能
  4. 以上全部
 

答案 2)

解释:抽象强调只展示对象的关键特征,同时隐藏其错综复杂的细节。


5. 为什么使用抽象?

  1. 它促进了可重用性
  2. 它促进了模块化
  3. 它促进了可扩展性
  4. 以上全部
 

答案 4)

解释:它促进了代码的可重用性、模块化和可扩展性,使软件系统的维护和扩展更加容易。


下一个主题Java 中的 REPL