何时必须使用接口而不是抽象类?

我想知道什么时候应该使用接口。

让我们考虑以下几点:

public abstract class Vehicle {
   abstract float getSpeed();
}

和:

public interface IVehicle {
  float getSpeed();
}

我可以很容易地实现它们,它们具有相同的功能...但是我也可以向我的车辆类别添加一些变量,这些变量可能应该在车辆中使用(maxSpeed,carType...)

使用接口的原因是什么?

谢谢!

编辑:我在另一个线程中发现了一个很好的链接:http://www.thecoldsun.com/en/content/01-2009/abstract-classes-and-interfaces


答案 1

来自 Java How to Programming about abstract classes:

因为它们仅用作继承层次结构中的超类,所以我们将它们称为抽象超类。这些类不能用于实例化对象,因为抽象类是不完整的。子类必须将“缺失的部分”声明为“具体”类,您可以从中实例化对象。否则,这些子类也将是抽象的。

要回答您的问题“使用接口的原因是什么?

抽象类的目的是提供一个适当的超类,其他类可以从中继承并因此共享公共设计。

与接口相反:

接口描述了一组可以在对象上调用的方法,但并不为所有方法提供具体的实现...一旦一个类实现了一个接口,该类的所有对象都与接口类型具有 is-a 关系,并且该类的所有对象都保证提供接口所描述的功能。该类的所有子类也是如此。

所以,为了回答你的问题“我想知道我什么时候应该使用接口”,我认为当你想要一个完整的实现时,你应该使用接口,当你想要部分部分用于你的设计(为了可重用性)时使用抽象类。


答案 2

甲骨文教程

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

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

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