为什么接口优先于抽象类?

2022-09-01 04:43:32

我最近参加了一次面试,他们问我一个问题:“为什么接口比抽象类更受欢迎?

我试着给出一些答案,比如:

  • 我们只能得到一个扩展功能
  • 它们是100%抽象的
  • 实现不是硬编码的

他们要求我采用您使用的任何JDBC api。“为什么它们是接口?

我能得到更好的答案吗?


答案 1

面试问题反映了提问者的某种信念。我相信这个人是错的,因此你可以走两个方向之一。

  1. 给他们他们想要的答案。
  2. 恭敬地表示不同意。

他们想要的答案,嗯,其他海报已经很好地突出了这些。多接口继承,继承强制类做出实现选择,接口可以更容易地改变。

但是,如果你在不同意中创造了一个令人信服的(也是正确的)论点,那么面试官可能会注意到这一点。首先,强调界面的积极因素,这是必须的。其次,我想说的是,接口在很多情况下都更好,但它们也会导致代码重复,这是一件负面的事情。如果你有各种各样的子类,它们将执行大致相同的实现,再加上额外的功能,那么你可能需要一个抽象类。它允许您拥有许多具有细粒度细节的类似对象,而仅使用接口,您必须具有许多具有几乎重复代码的不同对象。

接口有很多用途,并且有令人信服的理由相信它们“更好”。但是,您应该始终使用正确的工具来完成这项工作,这意味着您无法注销抽象类。


答案 2

一般来说,这绝不是一个应该盲目遵循的“规则”,最灵活的安排是:

interface
   abstract class
       concrete class 1       
       concrete class 2

该接口存在有几个原因:

  • 已经扩展了某些内容的现有类可以实现接口(假设您可以控制现有类的代码)
  • 现有类可以是子类,子类可以实现接口(假设现有类是可子类化的)

这意味着您可以采用预先存在的类(或者只是必须从其他类扩展的类)并让它们与您的代码一起使用。

抽象类用于为具体类提供所有公共位。抽象类从编写新类或修改要扩展的类时开始扩展(假设它们从 java.lang.Object 扩展)。

您应该始终(除非您有充分的理由不这样做)将变量(实例、类、局部和方法参数)声明为接口。