谈谈接口和抽象类有什么区别?

接口是对行为的抽象,它是抽象方法的集合,利用接口可以达到 API 定义和实现分离的目的。

接口,不能实例化;不能包含任何非常量成员,任何 field 都是隐含着 public static final 的意义;同时,没有非静态方法实现,也就是说要么是抽象方法,要么是静态方法。Java 标准类库中,定义了非常多的接口,比如 java.util.List。

抽象类是不能实例化的类,用 abstract 关键字修饰 class,其目的主要是代码重用。除了不能实例化,形式上和一般的 Java 类并没有太大区别,可以有一个或者多个抽象方法,也可以没有抽象方法。抽象类大多用于抽取相关 Java 类的共用方法实现或者是共同成员变量,然后通过继承的方式达到代码复用的目的。

Java 标准库中,比如 collection 框架,很多通用部分就被抽取成为抽象类,例如java.util.AbstractList。

Java 类实现 interface 使用 implements 关键词,继承 abstract class 则是使用 extends 关键词,我们可以参考 Java 标准库中的 ArrayList。

接口vs抽象类vs类

1 支持多重继承:接口支持;抽象类不支持;类不支持;
2 支持抽象函数:接口语义上支持;抽象类支持;类不支持;
3 允许函数实现:接口不允许;抽象类支持;类允许;
4 允许实例化:接口不允许;抽象类不允许;类允许;
5 允许部分函数实现:接口不允许;抽象类允许;类不允许。
6 定义的内容:接口中只能包括public函数以及public static final常量;抽象类与类均无任何限制。
7 使用时机:当想要支持多重继承,或是为了定义一种类型请使用接口;当打算提供带有部分实现的“模板”类,而将一些功能需要延迟实现请使用抽象类;当你打算提供完整的具体实现请使用类。

在实际项目开发过程,一方面是业务需求频繁,需要满足开闭原则,也就是小到一个模块,大到一个架构都需要有好的可扩展性;另外一方面软件往往是团队协同开发的过程;由于团队成员水平参差不齐,这方面的坑不少。可以通过前期做好设计评审、code review等手段去提升代码质量。

你可能感兴趣的:(计算机技术)