前言
接口和抽象类看上去十分类似,但是深入挖掘的话会发现许多的异同。本文主要介绍了接口和抽象类的特点和异同。
一、抽象类特点
- 抽象类和抽象方法都使用abstract关键字进行声明
- 如果一个类中包含抽象方法,那么这个类必须声明为抽象类
- 抽象类不能被实例化,只能被继承
二、接口特点
- 接口是抽象类的延申
- 在Java8之前,接口可以被看做一个完全抽象的类,即不能有任何的方法实现
- 从Java8开始,接口可以拥有default方法实现,目的是为了方便接口演化
- 接口的字段默认为public static final
- 接口的方法默认为public。Java9开始允许将方法定义为private,但是只能作为当前接口其他方法的辅助方法,不能在接口外使用
三、二者差异
- 抽象类提供了一种IS-A关系,接口更像是LIKE-A关系
- 一个类可以实现多个接口,但是最多只能继承一个抽象类
- 接口字段只能为static和final类型,而抽象类的字段没有限制
- 接口成员只能为public类型,而抽象类的成员可以有多种访问权限
四、使用选择
1.使用接口
- 需要让不相关的类都实现一个方法
- 需要使用多重继承
2.使用抽象类
- 需要在几个相关的类中共享代码
- 需要能控制继承来的成员的访问权限,而不是都为public
- 需要继承非静态和非常量字段
总结
本文简单介绍了两者特点及区别。在很多情况下,接口优于抽象类。因为接口没有抽象类严格的类层次结构要求,可以灵活地为一个类添加行为。并且从Java8开始,接口也可以有默认的方法实现,使得修改接口的成本降低。简而言之,抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。