接口与抽象类的区别

总览

特性 接口 抽象类
方法实现 只能包含抽象方法(Java 8 之后支持默认方法和静态方法) 可以包含抽象方法和具体方法
成员变量 只能包含常量(默认 public static final 可以包含实例变量、静态变量和常量
多重继承 一个类可以实现多个接口 一个类只能继承一个抽象类
访问修饰符 方法默认是 public 方法可以是 publicprotecteddefault
构造器 没有构造器 可以有构造器
适用场景 定义一组不相关类的共同行为 定义一组相关类的共同行为和属性
实现和继承 implements extends
版本要求 Java 8 之前只能包含抽象方法 任意版本支持

区别

  1. 接口使用 interface ,抽象类使用 abstract

  2. 一个类可以实现多个接口,但只能继承一个抽象类

  3. 接口成员变量一定是public static final,抽象类成员变量没有约束

  4. 接口没有构造函数,抽象类可有可无

  5. 接口的方法一般是public abstract (Java8 后有default和static),抽象类可以有抽象方法和非抽象方法,修饰符也没有限制;接口的default可以显式定义,抽象类不允许显式定义default

  6. 使用场景:接口是like a,是行为规范,抽象类是 is a,是类的抽象

共同点

  1. 都是多态的实现方式
  2. 都不能被实例化
  3. 都可以包含抽象方法