1 概念与特性
- 成员默认 public
- 常量必须赋初值,内部类自动成为 static 类。
- 不能含有实例域,不能实现方法。(JDK 8 之后允许提供静态方法、默认方法)
- 可以声明接口变量,不能使用 new 实例化一个接口。
2 接口与抽象类
2.1 接口与抽象类的区别
- 从设计层面上看,抽象类提供了一种 IS-A 关系,需要满足里式替换原则,即子类对象必须能够替换掉所有父类对象。而接口更像是一种 LIKE-A 关系,它只是提供一种方法实现契约,并不要求接口和实现接口的类具有 IS-A 关系。
- 从使用上来看,一个类可以实现多个接口,但是不能继承多个抽象类。
- 接口的字段只能是 static 和 final 类型的,而抽象类的字段没有这种限制。
- 接口的成员只能是 public 的,而抽象类的成员可以有多种访问权限。
2.2 使用选择
1)使用接口
- 需要让不相关的类都实现一个方法,例如不相关的类都可以实现 Compareable 接口中的 compareTo() 方法;
- 需要使用多重继承。
2)使用抽象类
- 需要在几个相关的类中共享代码。
- 需要能控制继承来的成员的访问权限,而不是都为 public。
- 需要继承非静态和非常量字段。
在很多情况下,接口优先于抽象类。因为接口没有抽象类严格的类层次结构要求,可以灵活地为一个类添加行为。并且从 Java 8 开始,接口也可以有默认的方法实现,使得修改接口的成本也变的很低。
3 Java 8 新特性
3.1 静态方法
Java SE 8 中,允许接口中增加静态方法。
3.2 默认方法
Java SE 8 中,可以为接口方法提供一个默认实现。必须用 default 标记。
一个重要用法是“接口演化”,接口中新增的方法有了默认方法就不会影响以前实现这个接口的类。
Java SE 8 之后就不需要伴随类了。
默认方法冲突
如果现在接口中将一个方法定义为默认方法,然后又在超类或另一个接口定义了同样方法。规则如下:
- 超类优先。
- 接口冲突。必须覆盖这个方法。