接口是对行为的抽象,它是抽象方法的集合,利用接口可以达到 API 定义和实现分离的目的。
接口,不能实例化;不能包含任何非常量成员,任何 field 都是隐含着 public static final 的意义;同时,没有非静态方法实现,也就是说要么是抽象方法,要么是静态方法。Java 标准类库中,定义了非常多的接口,比如 java.util.List。
抽象类是不能实例化的类,用 abstract 关键字修饰 class,其目的主要是代码重用。除了不能实例化,形式上和一般的 Java 类并没有太大区别,可以有一个或者多个抽象方法,也可以没有抽象方法。抽象类大多用于抽取相关 Java 类的共用方法实现或者是共同成员变量,然后通过继承的方式达到代码复用的目的。
Java 标准库中,比如 collection 框架,很多通用部分就被抽取成为抽象类,例如java.util.AbstractList。
Java 类实现 interface 使用 implements 关键词,继承 abstract class 则是使用 extends 关键词,我们可以参考 Java 标准库中的 ArrayList。
接口vs抽象类vs类
1 支持多重继承:接口支持;抽象类不支持;类不支持;
2 支持抽象函数:接口语义上支持;抽象类支持;类不支持;
3 允许函数实现:接口不允许;抽象类支持;类允许;
4 允许实例化:接口不允许;抽象类不允许;类允许;
5 允许部分函数实现:接口不允许;抽象类允许;类不允许。
6 定义的内容:接口中只能包括public函数以及public static