含有abstract修饰符的class即为抽象类,抽象类不能创建实例对象。含有abstract方法的类必须定义为abstract class,abstract class中的方法不必是抽象的。abstract class中定义抽象方法必须在具体(Concrete)子类中实现。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的variable默认为public static final。选择如果抽象类和接口都可以使用,则优先使用接口,避免单继承的局限。
下表归纳了二者的主要差别:
序号 | 区别点 | 抽象类 | 接 口 |
1 | 基本定义 | 包含抽象方法的类 | 抽象方法和全局常量的集合 |
2 | 组成 | 构造方法,抽象方法,普通方法,常量,变量 | 常量,抽象方法 |
3 | 使用 | 子类继承抽象类(extends) | 子类实现接口(implements) |
4 | 关系 | 抽象类可以实现多个接口 | 接口不能继承抽象类,但允许继承多个接口 |
5 | 常见设计模式 | 模板设计 | 工厂设计,代理设计 |
6 | 对象 | 都通过对象的多态性产生实例化对象 | |
7 | 局限 | 抽象类有单继承的局限 | 接口没有此局限 |
8 | 实际 | 作为一个模板 | 作为一个标准或表示一种能力 |
9 | 内部定义 | 在抽象类中可以定义多个内部抽象类 | 在接口中可以定义多个内部接口 |
11 | 特殊 | 一个抽象类中可以包含多个接口,一个接口中可以包含多个抽象类 |