接口优于抽象类。—— 《Effective Java》(Item 18)
0. 语法区别
- 抽象类允许给出某些方法的实现,接口不允许;
- 为了实现由抽象类定义的类型(type),类必须成为抽象类的子类(extends,表示的含义是
is a
)- Java 仅允许单继承,抽象类作为类型定义局限性很大。
- 而任何一个类,只要它定义了所有必要的方法,并且遵守通用约定,它就被允许实现一个接口,而与该类所处的层次(class hierarchy)无关。
1. 多重继承
- 接口不仅仅是一种更纯粹形式的抽象类,设计接口的意义远不止于此。接口是根本没有任何具体实现的,在存储意义上,没有任何与接口相关的存储,也就无法阻止多个接口的组合。
- 借用 C++ 中的概念,组合多个类的接口的行为就加多重继承;