1、从设计角度上
接口是对方法的抽象,抽象方法的集合,对象和它关系表示着“has this”。
抽象类是一些基类提取出来的方法或者属性,对象和它表示着“is a”。
2、从语法角度上 (1.8版本之前)
2.1 支持多重继承:接口支持;抽象类不支持;类不支持;
2.2 支持抽象函数:接口语义上支持;抽象类支持;类不支持;
2.3 允许函数实现:接口不允许;抽象类支持;类允许;
2.4 允许实例化:接口不允许;抽象类不允许;类允许;
2.5 允许部分函数实现:接口不允许;抽象类允许;类不允许。
2.6 定义的内容:接口中只能包括public函数以及public static final常量;抽象类与类均无任何限制。
2.7 使用时机:当想要支持多重继承,或是为了定义一种类型请使用接口;当打算提供带有部分实现的“模板”类,而将一些功能需要延迟实现请使用抽象类;当你打算提供完整的具体实现请使用类。
注意:从 Java 8 开始,interface 增加了对 default method 的支持。Java 9 以后,甚至可以定义 private default method。Default method 提供了一种二进制兼容的扩展已有接口的办法。