是否可以抽象类替换接口?

Reg*_*ser 21 java oop abstract-class interface

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

Boz*_*zho 34

不总是:

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

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

抽象类与接口

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

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

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


Pau*_*and 13

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

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

使用抽象类的另一个"问题"是,您可以不再实现mixins,即可以实现多个接口,但是您只能扩展一个抽象类.


seh*_*seh 11

这里的答案中缺少的一点是谁将实现界面的想法.

如果组件想要将抽象类型的实例返回给其调用者,其中具体类型在内部定义并且对调用者隐藏,则使用接口.相反,如果你的组件消耗接受抽象类型的实例,它的调用者必须实现的抽象类通常是更好的选择.

预期进化和维护二进制兼容性提示了这里的规模.使用抽象类,您可以添加方法,如果提供基本实现,抽象类的现有实现将继续正常工作.使用接口,添加方法会破坏二进制兼容性,因为没有现有的实现可以继续正确编译而无需更改以定义新方法.

Apache的仙人掌项目具有良好的讨论,就如何解决这些义务.


Ada*_*ski 5

要回答你的问题,是的,你可以使用抽象类(不提供实现)而不是接口,但我会考虑这种不好的做法:

  • 你已经用完了继承的"一次性"(没有获得任何好处).
  • 您不能从多个抽象类继承,但可以实现多个接口.

我希望在你希望提供类的部分实现的情况下更多地使用抽象类,可能会将某些行为委托给具体的子类实现.