特性

抽象类

  • 包含抽象方法的一定是抽象类,但是抽象类不一定含有抽象方法;

  • 抽象类中的抽象方法的修饰符只能为public或者protected,默认为public;

  • 一个子类继承一个抽象类,则子类必须实现父类抽象方法,否则子类也必须定义为抽象类;

  • 抽象类可以包含属性、方法、构造方法,但是构造方法不能用于实例化,主要用途是被子类调用。

接口

  • 接口成员变量默认为public static final,必须赋初值,不能被修改
  • JDK1.8中对接口增加了新的特性:
  • (1)、默认方法(default method):JDK 1.8允许给接口添加非抽象的方法实现,但必须使用default关键字修饰;定义了default的方法可以不被实现子类所实现,但只能被实现子类的对象调用;如果子类实现了多个接口,并且这些接口包含一样的默认方法,则子类必须重写默认方法;
  • (2)、静态方法(static method):JDK 1.8中允许使用static关键字修饰一个方法,并提供实现,称为接口静态方法。接口静态方法只能通过接口调用(接口名.静态方法名)

抽象类和接口的区别

  • 接口强调特定功能的实现,而抽象类强调所属关系
参数 抽象类 接口
默认的方法实现 它可以有默认的方法实现 jdk1.8之后通过default提供方法默认实现
构造器 抽象类可以有构造器,提供给子类super调用 接口没有构造器
与正常Java类的区别 除了你不能实例化抽象类之外,它和普通Java类没有任何区别 接口是完全不同的类型
访问修饰符 抽象方法可以有publicprotecteddefault这些修饰符 接口方法默认修饰符是public。你不可以使用其它修饰符。
main方法 抽象方法可以有main方法,且可以运行抽象类main方法 接口没有main方法
速度 它比接口速度要快 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。
添加新方法 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 如果你往接口中添加方法,那么你必须改变实现该接口的类。
1.8提供default,则无需修改
设计理念 is-a的关系,体现的是一种关系的延续 like-a体现的是一种功能的扩展关系