第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();
}
原文地址:https://www.cnblogs.com/13jhzeng/p/5705844.html