vs 抽象类

抽象类 接口类
特性 不允许被实例化,只能被继承,且只能单继承 不允许被实例化,只能被其他类实现,并支持多接口实现
抽象类可以包含属性和方法;方法既可以是普通方法,也可以是抽象方法 不包含属性和普通方法,包含抽象方法、静态方法、default 方法、枚举、甚至嵌套接口,且方法只能以public修饰
子类继承抽象类 ,必须实现抽象类中的所有抽象方法。除非,自己也是一个抽象类 类实现接口的时候,必须实现接口中声明的所有抽象方法
意义 抽象类和子类表示的是 is-a 关系,实现代码复用 接口和实现类表示的是 has-a 关系,实现解耦,隔离接口和具体的实现,提高代码的扩展性
用途 实现继承特性、实现模版设计模式 等… 实现抽象特性、多态特性、实现基于接口编程而非实现的设计原则 等…

Java8中对接口的增强

  1. 允许通过default关键字来默认实现接口

在java8之前,定义的接口不能有具体实现,这会导致在后续维护的时候如果想要在接口中新增一个方法,必须在所有实现类中都实现一遍,并且只有几个新的实现类可能要去具体实现,其他的都只是加上默认实现,这样比较麻烦。在java8中接口可以用使用关键字default,来实现一个默认方法,这样就解决了上述的麻烦。

  1. 允许在接口中添加静态方法

这么做能恰当地把工具功能置于接口中,从而操作接口,或者成为通用的工具。

使用建议

《on java8》中给出了如下建议:
在合理的范围内尽可能地抽象。因此,更倾向使用接口而不是抽象类。只有当必要时才使用抽象类。
除非必须使用,否则不要用接口和抽象类。大多数时候,普通类已经做得很好,如果不行的话,再移动到接口或抽象类中。