- 抽象类不能被实例化,只能被继承。
- 抽象类和抽象方法都使用 abstract 关键字进行声明。
- 如果一个类中包含抽象方法,那么这个类必须声明为抽象类。
- 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现。
- 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。
- 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
- 接口是抽象类的延伸,在 Java 8 之前,它可以看成是一个完全抽象的类,也就是说它不能有任何的方法实现。
- 从 Java 8 开始,接口也可以拥有默认的方法实现(用 default 声明),这是因为不支持默认方法的接口的维护成本太高了。在 Java 8 之前,如果一个接口想要添加新的方法,那么要修改所有实现了该接口的类,让它们都实现新增的方法。
- 接口的成员(字段 + 方法)默认都是 public 的,并且不允许定义为 private 或者 protected。
- 接口的字段默认都是 static 和 final 的。
- 当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。
- 接口支持多继承。
- 从设计层面上看,抽象类提供了一种 IS-A 关系,需要满足里式替换原则,即子类对象必须能够替换掉所有父类对象。而接口更像是一种 LIKE-A 关系,它只是提供一种方法实现契约,并不要求接口和实现接口的类具有 IS-A 关系。
- 从使用上来看,一个类可以实现多个接口,但是只能继承一个抽象类。
- 接口的字段只能是 static 和 final 类型的,而抽象类的字段没有这种限制。
- 接口的成员只能是 public 的,而抽象类的成员可以有多种访问权限。
- 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。