抽象类与接口的区别

111 阅读2分钟

抽象方法

抽象方法就像是存在于父类中的蓝图, 本身并没有任何实现细节. 子类或接口有责任去实现它们. 抽象类的抽象方法是为了强制子类按照规定的格式重写方法, 方便团队协作

抽象类

抽象类就是从子类中发现公共部分而形成的一种泛化.

抽象类命名要使用 Abstract 或 Base 开头,这是条开发规约,真正做到名如其意。

image.png

抽象类的应用场景

抽象类提供了一种机制, 使得我们可以定义一个类的骨架, 而不必关心具体的实现细节.

  1. 我想为子类提供一些直接可用的属性和功能, 但我又不想被创建实例.

  2. 抽象类既可以为子类提供一些通用的方法(非抽象方法), 从而减少子类代码重复; 又可以设置抽象方法, 允许子类各自定制该方法, 保证了灵活性.

接口

接口是对行为的抽象.

image.png

若接口存在继承链, 则其实现类必须实现"祖宗"们的全部抽象方法

接口的应用场景

  1. 为不同类族的类提供一个相同的行为规范

我们拿接口Comparable来做例子. 比较(CompareTo) 这种行为很难界定适用的类族, 实际上, 几乎所有的类都可以比较. 比如 数字类可以比较大小, 人类可以比较财富, 动物可以比较体重等. 所以各种类都可以实现这个比较接口.

抽象类和接口的区别?

抽象类是对事物的抽象, 接口是对行为的抽象. 抽象类强调"is-a"关系, 接口强调"can-do"关系(查看java源代码可以发现很多接口都是以-able作后缀).
抽象类中抽象方法参数仅限于继承关系中的子类, 而接口的方法参数并没有限制. 比如拉货这一方法, 马可以拉货, 车也可以拉货, 但是这个方法却并不适合写成抽象方法, 因为马和车不太可能去继承同一个抽象类, 也就是两者不是同一类族, 因此更适合定义成接口.