Java 中的抽象类

2025年4月28日 | 阅读 8 分钟

在 Java 编程的世界里,抽象类在定义类结构及其在继承体系中的行为方面发挥着重要作用。它们为其他团队提供了一个遵循的蓝图,并且一些方法保持未定义状态。这种灵活性使开发人员能够生成组织良好且可扩展的代码库。在本节中,我们将探讨 Java 中抽象类的概念,研究其特性、优点和最佳实践。

用 abstract 关键字声明的类称为抽象类。它可以拥有抽象方法和非抽象方法(带有方法体的)。

在学习 Java 抽象类之前,我们先来理解一下 Java 中的抽象

Java中的抽象

抽象 是隐藏实现细节,只向用户展示功能的。

换句话说,它只向用户展示必要的东西,而隐藏内部细节,例如发送短信,我们输入文字并发送消息。我们不知道消息传递的内部处理过程。

抽象允许你专注于对象做什么,而不是它如何做。

实现抽象的方式

在 Java 中实现抽象有两种方式

使用抽象类(0% 到 100%)

使用接口(100%)

Java 中的抽象类

Java 中的抽象类充当一个部分实现的类,它本身不能被实例化。它仅用于子类化目的,并为子类提供一个模板。抽象类可以具有抽象方法的实现。抽象方法的声明没有方法体,将其实现留给子类。

注意事项

  • 抽象类必须用 abstract 关键字声明。
  • 它可以有抽象方法和非抽象方法。
  • 它不能被实例化。
  • 它也可以有构造函数和静态方法。
  • 它可以有 final 方法,这将强制子类不能更改方法的体。
Rules for Java Abstract class

抽象类的语法

在 Java 中,抽象类使用 abstract 关键字定义。以下是一个基本的语法示例:

在此示例中,Shape 是一个抽象类,带有一个抽象方法 area() 和一个具体方法 display()。Shape 的子类必须实现 area() 方法,但它们可以继承 display() 方法。

Abstract Method in Java

被声明为 abstract 且没有实现的类称为抽象方法。

抽象方法的示例

包含抽象方法的抽象类示例

在此示例中,Bike 是一个抽象类,它只包含一个抽象方法 run。它的实现由 Honda 类提供。

示例

编译并运行

输出

running safely

为什么使用抽象类?

抽象类在各种场景下都很有益,包括:

代码重用:抽象类通过允许将公共方法实现一次并由多个子类继承来促进代码重用。

定义通用接口:抽象类可以为一组相关类定义一个通用接口,确保它们的结构和行为一致。

强制方法实现:抽象类可以通过将其声明为抽象来强制实现某些方法,从而确保子类提供必要的功能。

抽象类的实际场景

在此示例中,Shape 是抽象类,其实现由 Rectangle 和 Circle 类提供。

通常,我们不知道实现类(对最终用户隐藏),并且实现类的对象由工厂方法提供。

工厂方法是返回类实例的方法。稍后我们将学习工厂方法。

在此示例中,如果我们创建 Rectangle 类的实例,将调用 Rectangle 类的 draw() 方法。

示例

编译并运行

输出

drawing circle

Java 中抽象类的另一个示例

示例

编译并运行

输出

Rate of Interest is: 7 %
Rate of Interest is: 8 %

抽象类:具有构造函数、数据成员和方法

抽象类可以拥有数据成员、抽象方法、方法体(非抽象方法)、构造函数,甚至 main() 方法。

示例

编译并运行

输出

       bike is created
       running safely..
       gear changed

规则:如果一个类中有抽象方法,那么这个类必须是抽象类。

输出

compile time error

规则:如果我们正在扩展一个包含抽象方法的抽象类,我们必须要么提供该方法的实现,要么将该类声明为抽象类。

抽象类的另一个实际场景

抽象类也可以用于提供接口的某些实现。在这种情况下,最终用户可能不必强制覆盖接口的所有方法。

注意:如果我们是 Java 初学者,请先学习接口,然后查看此示例。

示例

编译并运行

输出

   I am a
   I am b
   I am c
   I am d

抽象类的主要特性

抽象方法:抽象类可以包含抽象方法,这些方法声明时没有方法体。子类必须为这些方法提供具体的实现。

具体方法:抽象类也可以包含具有已定义行为的具体方法。子类继承这些方法及其实现。

不能实例化:抽象类不能直接实例化。它们充当其他类的蓝图,必须被扩展才能使用。

可以有构造函数:抽象类可以有构造函数,在创建子类对象时会调用它们。这些构造函数用于初始化抽象类的状态。

使用抽象类的最佳实践

为了充分利用 Java 中的抽象类,请考虑以下最佳实践:

保持抽象类简洁:尽量让抽象类专注于单一职责,以保持清晰和简单。

将抽象类用于相关对象:抽象类最适用于一组相关对象共享共同特征和行为的场景。

首选接口进行多重继承:如果一个类需要从多个来源继承,请优先使用接口而不是抽象类,因为 Java 不支持类的多重继承。

提供有意义的抽象方法:在定义抽象方法时,请确保它们具有清晰有意义的名称,以传达它们对子类的目的。

结论

Java 中的抽象类提供了一种强大的方式来定义层次结构并促进代码重用和一致性。通过为子类提供一个遵循的模板,抽象类使开发人员能够创建组织良好且易于维护的代码库。了解何时以及如何正确使用抽象类对于编写健壮且可扩展的 Java 应用程序至关重要。通过本文分享的见解,您现在可以在 Java 项目中使用依赖项和抽象类了。


Java 抽象类选择题

1. 关于 Java 中的抽象类,以下哪个陈述是正确的?

  1. 抽象类不能包含任何有实现的方法。
  2. 抽象类不能被实例化。
  3. 抽象类只能包含抽象方法。
  4. 抽象类不能有构造函数。
 

答案:b)

解释:抽象类可以包含有实现的方法和构造函数,但它们不能直接实例化。它们旨在被子类扩展,子类为抽象方法提供实现。


2. 如果一个类扩展了一个抽象类,但没有实现所有抽象方法,会发生什么?

  1. 该类仍可被实例化。
  2. 该类本身将成为抽象类。
  3. 会发生编译时错误。
  4. 未实现的的的方法将被忽略。
 

答案:b)

解释:如果子类没有实现抽象类的所有抽象方法,它本身必须被声明为抽象类,否则会发生编译时错误。


3. 在 Java 中,抽象类可以有静态方法吗?

  1. 可以,但不能调用它们。
  2. 不可以,抽象类不允许有静态方法。
  3. 可以,并且可以在不创建类实例的情况下调用它们。
  4. 不可以,因为静态方法必须有方法体。
 

答案:c)

解释:抽象类可以包含静态方法,这些方法可以在不创建类实例的情况下调用。这些方法不与抽象类的任何特定实例绑定。


4. 在 Java 中,用于将类声明为抽象类的关键字是什么?

  1. abstract
  2. 摘要
  3. final
  4. static
 

答案:a)

解释:abstract 关键字用于将类声明为 Java 中的抽象类。它表示该类不能被实例化,并且可能包含抽象方法。


5. 在 Java 中,抽象类可以在不提供所有方法实现的情况下实现接口吗?

  1. 可以,抽象类可以将实现留给其子类。
  2. 不可以,它必须提供所有接口方法的实现。
  3. 可以,但前提是接口有默认方法。
  4. 不可以,抽象类不能实现接口。
 

答案:a)

解释:抽象类可以在不提供所有方法实现的情况下实现接口。实现剩余方法的责任被转嫁给子类。


下一个主题Java 中的接口