对比维度 抽象类(is what) 接口(can do)
定义方式 借助 abstract class 来定义 通过 interface 进行定义
实现手段 利用 extends 关键字实现继承 使用 implements 关键字实现接口
成员变量 可以包含普通变量和常量 只能是 public static final 类型的常量
方法类型 能够有抽象方法,也能有具体实现的方法 所有方法默认是 public abstract 的(Java 8 及之后版本允许有默认方法和静态方法)
多继承支持 仅支持单继承(一个类只能继承一个抽象类) 支持多实现(一个类可实现多个接口)
设计侧重点 强调 “是什么”,用于对一组相关类的共同特征进行抽象 着重 “能做什么”,定义了一种行为规范或契约

相同点:

1、多是抽象形式,都可以有抽象方法,都不能创建对象。
2、都是派生子类形式:抽象类是被子类继承使用,接口是被实现类实现。
3、一个类继承抽象类,或者实现接口,都必须重写完他们的抽像方法,否则自己要成为抽象类或者报错!
4、都能支持的多态,都能够实现解耦合。

不同点:

1、抽象类中可以定义类的全部普通成员,接口只能定义常量,油象方法(JDK8新增的三种方式)
2、抽象类只能被类单继承,接口可以被类多实现。
3、一个类继承抽象类就不能再继承其他类,一个类实现了接口(还可以继承其他类或者实现其他接口)。
4、抽象类体现模板思想:更利于做父类,实现代码的复用性。
5、接口更适合做功能的解耦合:解耦合性更强更灵活。