抽象类可以取代接口吗?

2022-09-02 00:04:41

在 Java 中,可以创建仅包含抽象方法的抽象类。另一方面,您可以创建声明相同方法的接口。既然如此,你能使用抽象类而不是接口吗?


答案 1

并非总是:

  • 一个类只能扩展一个
  • 一个类可以实现多个接口

Sun 文档进行了更详细的比较:

抽象类与接口

与接口不同,抽象类可以包含非静态和最终的字段,并且可以包含实现的方法。此类抽象类类似于接口,不同之处在于它们提供部分实现,将其留给子类来完成实现。如果抽象类仅包含抽象方法声明,则应将其声明为接口。

多个接口可以由类层次结构中任何位置的类实现,无论它们是否以任何方式相互关联。例如,想想可比较或可克隆。

相比之下,抽象类最常被子类化以共享实现部分。单个抽象类由具有许多共同点(抽象类的实现部分)的类似类子类化,但也具有一些差异(抽象方法)。


答案 2

在某些情况下,您可以使用抽象类而不是接口。但是,这样做几乎不是一个好主意。通常,您应该使用以下规则:

  1. 接口指定行为。
  2. 抽象类指定实现。

使用抽象类的另一个“问题”是,您无法再实现mixins,也就是说,您可以实现多个接口,但是您只能扩展一个抽象类。