除非你需要提供子类一些状态,或者提供子类某些方法的默认实现,或者想要推迟一些抽象方法的实现,否则请始终使用接口。
请注意,你只能扩展一个类,而可以实现多个接口。因此,如果有任何可能子类需要扩展其他类,请使用接口。
以下是一些讨论此主题的良好链接:
简单来说:
如果你希望通过一种通用的方式访问你的对象,那么使用接口。 如果你想在超类中定义一些功能,并定义一些必须在子类中重写的方法原型,即扩展类的功能,则使用抽象类。 下面是一个有趣的例子,可能会帮助你澄清基本原理。
http://ganeshtiwaridotcomdotnp.blogspot.com/2011/05/understanding-importance-of-interface.html
如果你不想实现任何方法,只是想定义你的契约,那么你就可以使用接口。
然而,如果你需要一些已经实现的方法,那么你应该使用抽象类。
如果您想要为子类提供部分实现并且只想要提供必须被实现的方法签名,则使用抽象类。如果您只想要提供必须被实现的方法签名,则使用接口。同时提供接口和抽象类实现部分内容也是完全正常的。
但是,抽象类有一个限制:在子类中,您只能扩展一个(抽象)类,但是您可以在单个类中实现任意多个接口。
接口仅仅是一组 public
方法签名和 public static final
字段。没有构造函数,没有受保护的/内部方法,也没有其他类型的字段。
另一方面,任何类只要在声明前加上 abstract
就可以成为抽象类。它们可以声明抽象方法并实现接口和其他抽象类而不定义方法实现。
抽象类在继承方面更具限制性(只能有一个子类),但你可以在其中实现方法和构造函数。
一个类可以实现任意数量的接口,但没有默认的方法和构造函数实现。
这就是为什么最好提供一个抽象类作为接口的默认实现选项。