接口与抽象类
抽象类和抽象方法都用abstract修饰,抽象类不能被实例化,只能被继承。
jdk8之前,接口可以看作特殊的抽象类。是一个完全抽象的类。
jdk8,接口可以拥有默认的方法实现,因为不支持默认方法的接口维护成本太高了。接口添加新的方法,其他实现了这个接口的类都需要实现新增的方法。
接口的成员(字段和方法)默认都是public(抽象类没有限制),不允许其他。从jdk9开始允许方法定义为private,这样可以定义某些复用代码,又不会把方法暴露出去。
接口的字段默认是static和final的。
抽象类没有限制。
1. 比较
从设计上,抽象类关系is-a需要满足里氏替换原则,子类必须能完全替代父类。
接口关系是like-a,提供一种方法的契约。
2.选择
很多时候接口优先于抽象类,因为接口没有抽象类严格的类层级要求,可以灵活的为一个类添加新的行为。并且Java8开始,接口允许默认的方法实现,使得修改接口的成本变的很低。

查看14道真题和解析
