二者的特性
- 方法类型:接口只能有抽象方法。抽象类可以有抽象方法和非抽象方法。从Java 8 开始,抽象类可以有默认(default)方法和静态方法。
- Final变量:接口中的变量默认是final的。抽象类可能包含非final的变量。
- 变量类型:抽象类可以有final、非final、静态、非静态类型的变量。接口只能有静态类型的变量和final类型的变量。
- 实现: 抽象类可以实现接口,接口不能实现抽象类。
- 关键字:一个是implement,一个是extend。
- 多实现:接口只能extend另一个接口。抽象类既可以implement,又可以extend。
- 数据成员访问性:接口的数据成员是public的。抽象类可以有public private protected等等。
如何选择
应该用抽象类的场景通常包含以下特点:
- 想要在相关的的类之间共享一些代码
- 希望实现抽象类的子类们有大量相同的属性
- 希望声明非静态的或者非final的属性。这类属性通常是一个对象的,可能被修改的状态。
应该用接口的场景通常包含以下特点:
- 希望不相干的类去实现一些相同的方法(比如各种各样的类都想实现序列化方法)
- 你想利用多继承特性