PS:黑色加粗为重点关注内容
相同点:
- 抽象类和接口都不能实例化
不同点:
参数 | 抽象类 | 接口 |
声明 | 抽象类使用 abstract 关键字声明 | 接口使用 interface 关键字声明 |
实现 | 子类使用 extends 关键字来继承抽象类。 | 子类使用 implements 关键字来实现接口。 |
构造器 | 抽象类可以有构造器 | 接口不能有构造器。 |
方法的类型 | 既有抽象方法,还可以有已经实现的普通方法 | 只有抽象方法 |
多继承 | 一个类最多只能继承一个抽象类 | 一个类可以实现多个接口 |
成员变量 | 抽象类的成员变量可以是任意类型 | 接口的成员变量默认都是 public static final |
1.8的特性 | 通过使用 default 修饰方法,定义一个默认的方法,实现类可以直接调用,不用强制实现 |
抽象类和接口的本质:
- 接口
- 接口的目的是对类的行为进行约束,是一种行为的规范;
- 强制要求不同的实现类具有相同的方法;
- 只约束行为的有无,不限制行为的具体实现
- 抽象类
- 抽象类的目的是代码复用
- 通常会实现子类的通用特性,而将子类的差异化特性进行抽象,交由子类去实现
- 抽象类和接口的选择:
- 关注一个事物本质的时候,用抽象类;关注一个行为的时候,用接口
- 行为模型应该总是通过接口而不是抽象类定义,所以通常是优先选用接口,尽量少用抽象类。
- 抽象类通常是:需要定义子类的行为,又要为子类提供通用的功能。