Java 中的 extends vs. implements

10 Sept 2024 | 5 分钟阅读

Java 是一种多功能且广泛使用的编程语言,它提供了许多功能来开发复杂而高效的软件应用程序。Java 面向对象编程中的两个主要概念是扩展 (extends)实现 (implements)。这两个关键字在类关系以及类和网络如何交互方面起着重要作用。在本节中,我们将探讨 Java 中 extends 和 implements 的基本区别以及何时使用它们。

Extends:类之间的继承

extends 关键字用于建立类之间的属性关系。当一个类扩展另一个类时,它继承了超类(被扩展的类)的所有属性和行为(字段和方法)。从这个意义上说,子类是超类的一个基本组成部分。它通常被称为“is-a”关系,其中子类是超类的一种“is-a”。

这是一个基本示例

在上面的代码中,Car 类扩展了 Vehicle 类。因此,Car 类继承了 Vehicle 中的 start() 方法,并且还可以定义自己的方法 accelerate()。这是一个明显的继承示例,其中 Car 大部分拥有 Vehicle 的特性。

Implements:接口功能

当一个类想要遵循一个接口时,将使用 "implements" 关键字。在 Java 中,接口定义了一个契约,规定了实现该接口的每个类必须提供的具体方法签名。类可以实现多个接口,从而允许它们表现出不同的行为。

这是一个示例

在此代码中的 Bird 类实现了 Flyable 接口。通过这样做,它承诺为 fly() 方法提供实现。它还可以定义自己的方法,例如 chirp()。这指的是接口实现的概念,用于在 Java 中访问一组属性。

主要区别:Extends vs Implements

  • 继承 vs 接口:主要区别在于 "extends" 建立类之间的直接继承关系,而 "implements" 用于实现接口。一个类只能扩展一个超类,但可以实现多个接口。
  • 方法继承:当一个类扩展另一个类时,它会继承超类的所有字段和方法。相比之下,实现接口只需要使用该接口中声明的方法。
  • “is-a” vs. “can do”:"Extends" 指的是“is-a”关系,其中子类是超类的一种专业化版本。"Implements" 指的是“can do”关系,其中类可以执行接口指定的任何操作。
  • 扩展类,实现接口:一个类可以同时实现一个或多个接口。这允许类继承属性并遵守契约。

何时使用 Extends 和 Implements?

当我们要创建一个继承现有类的行为并且是唯一的类时,请使用 "extends"。这通常发生在实例化分层类时,其中每个子类修复并扩展超类的功能。

如果我们想为类定义一个契约,请使用 "implements" 来确保它提供指定的方法。当我们需要多态性并允许不同对象通过接口共享常见操作时,这非常有用。

这是一个完整的 Java 代码示例,它演示了 extends 和 implements 的用法,以区分类继承和接口实现。

ImplementsExample.java

输出

Circle Area: 78.53981633974483
Rectangle Area: 24.0
Drawing a circle.
Drawing a rectangle.

在此代码中,Circle 和 Rectangle 类都扩展了 Shape 类,通过类继承(使用 "extends")继承了 area 方法。此外,这两个类都实现了 Drawable 接口,为 draw 方法提供了实现,演示了接口实现(使用 "implements")。

main() 方法创建了 Circle 和 Rectangle 类的实例,计算了它们各自的面积,并调用了 draw 方法来展示类继承和接口实现的操作差异。

以下是输出的详细说明

Circle 对象计算并打印其面积,约为 78.54 (π * 5 * 5)。

Rectangle 对象计算并打印其面积,为 24 (4 * 6)。

调用 Circle 类的 draw 方法,打印“Drawing a circle.”。

调用 Rectangle 类的 draw 方法,打印“Drawing a rectangle.”。

输出演示了类继承("extends")和接口实现("implements")的操作差异。Circle 和 Rectangle 类都从 Shape 类继承了 area 方法(类继承),并且它们实现了 Drawable 接口以提供特定的绘图行为(接口实现)。

总而言之,"extends" 用于类属性,而 "implements" 用于接口实现。两者之间的选择取决于您的设计需求以及我们希望在 Java 代码中建立的关系。理解这些概念对于构建结构良好且可维护的 Java 应用程序至关重要。