第18条:接口优先于抽象类
Java提供两种机制,可以用来定义允许多个实现的类型:接口和抽象类。在Java 1.8之前,这两种机制最大的区别是,抽象类允许包含某些方法的实现,但是接口则不允许(这种情况在Java 1.8发布后被改变,接口可以用default修饰符来声明一个有实现的方法。
接口的好处:
1.现有的类可以很容易被更新,以实现新的接口。给类增加新行为,只需在声明中增加一个implements子句。
2.接口是定义混合类型的理想选择,混合类型指类除了实现“基本类型”之外(父类),还可以实现这个混合类型,以表明它提供了某些可供选择的行为,例如Comparable是一个接口,它表明允许它的实例与其他可相互比较的对象进行排序。抽象类不可以定义混合类型,因为类不可能有一个以上的父类。
3.接口允许构造非层次结构的类型框架,类型层次对组织某些事物非常合适,但有些事物不可能被整齐地组织成一个严格的层次结构,假如有两个接口,singer和songwriter:
public interface Singer { AudioClip sing(Song s); } public interface Songwriter { Song compose(boolean hit); }
实际上,有些singer本身也是个songwriter,所以对于单个类而言,同时实现singer和songwriter是被允许的,可以定义第三个接口,同时扩展Singer和Songwriter,并添加一些适合于这种组合的新方法 :
public interface SingerSongwriter extends Singer, Songwriter { AudioClip strum(); void actSensitive(); }