课时91:抽象类与接口区别
摘要:本文内容是抽象类与接口的区别,这是一道面试题。
在实际的开发之中可以发现抽象类和接口的定义形式是非常相似的,这一点从 JDK 1.8 开始实际上就特别的明显了,因为JDK1.8里面接口也可以定义 Default 或 Static 方法了,但是这两者依然是有着明显的定义区别与使用区别的。
No. |
区别 |
抽象类 |
接口 |
1 |
定义关键字 |
Abstract Class 抽象类名称{} |
Interface 接口名称{} |
2 |
组成 |
构造、普通方法、静态方法、全局常量、普通成员、Static方法 |
抽象方法、全局常量、普通方法、 Static方法、 |
3 |
权限 |
可以使用各种权限定义 |
只能够使用Public |
4 |
子类使用 |
子类通过Extends关键字可以继承一个抽象类 |
子类使用Implement 关键字 |
5 |
两者关系 |
抽象类可以实现若干个接口 |
接口不允许继承抽象类,但是允许继承多个接口。 |
6 |
使用 |
1.抽象类或接口必须定义子类; 2.子类一定要覆写抽象类或接口中的全部抽象方法; 3.通过子类的向上转型实现抽象类或接口对象实例化。 |
当抽象类和接口都可以使用的情况下优先要考虑接口,因为接口可以避免子类的单继承局限。
另外从一个正常的设计角度而言,也需要先从接口进来项目的整体设计。
现在,我们来探讨一个类比过程。首先,我们提及“动物”这一概念,并询问林强和郭仁义是否属于动物范畴。显然,这是一个分类问题。进一步地,我们需要理解郭仁义、林强与小强之间的关系。
林强作为哺乳类动物的代表是明确的。而小强则属于卵生动物类别。
这里,“动物”是一个广义的标准,其下又可细分为更具体的标准,如哺乳动物与卵生动物,这类似于接口继承的概念。如果我们向某人请求一个哺乳动物,他不太可能给我们一只鸡,因为鸡不属于哺乳动物,而可能给予我们一只狗,因为狗确实是哺乳动物的一种。同样,若要求一个卵生动物,可能会得到小强或鸭子等。
在哺乳动物这一大类中,人类是其中的一种。若我们在地面上看到四肢着地且汪汪叫的生物,很容易判断那是狗。但狗并非一个绝对具体的概念,因为它还包含了许多品种。因此,狗也可以被视为一个相对宽泛的标准,同时它符合更广泛的“动物”标准。再来看学生与人的关系,学生是人的一个更加细分、具体的概念。
通过这一过程,我们可以发现,在设计过程中,接口处于首要位置。随后才是抽象类,最后是普通类。对于初学者而言,建议先简化处理,直接使用接口和子类建立关系,因为抽象类的灵活运用需要一定的项目经验积累。
最后需要强调的是,类的设计是整个设计过程中的最底层、也是最终的一环。而接口和抽象类则是设计的起点和基础。对于这一概念,我们必须有清晰的认识。