接口(interface) 和 抽象类(abstract class) 的使用区别
在实践中,可能不太清楚什么时候使用接口,什么时候使用抽象类。
一个最准确的比喻可能会有所帮助。
可以将 interface
想象为定义“can-do
”或“is-a
”关系,而abstract class
更应该是更严格的“is-a
”关系。
两者的区别可能很微妙,可以经常使用功能其中一种来代替另一种。
在实践中,大型java库通常有一个层次结构的接口,这些接口由提供某些方法实现的抽象类扩展,然后
由具体类实现。
Collection
接口就是一个很好的例子:它扩展了Iterable
(它的父接口),并由很多子接口实现(如
List
、Set
、Map
),这些子接口又有自己的抽象实现(AbstractList
、AbstractSet
、AbstractMap
)。
然而,对于较小的程序,层次结构通常比较复杂,有时从抽象类开始。
例如,我们可以只在层次结构的顶部使用AbstractBoundedQueue
,而完全跳过使用BoundedQueue
接口。