Skip to content

接口和抽象类区别

语法层面

针对 jdk8 讨论

接口中只能定义抽象方法,也可以定义默认方法及其实现。一个类要实现接口必须实现这个接口中所有的抽象方法。

抽象类没有太多的限制,甚至一个普通类也可以直接加上 abstract 关键字称为抽象类,抽象类可以定义属性、方法,更多的限制在于抽象方法,抽象方法只能存在于接口和抽象类中。

思想层面

这一部分才是我想单独使用一篇笔记记录下来的原因,语法层面网上有太多太多的资料,我更想和大家聊一聊思想层面。先说结论再说原因:接口是自上向下的思想,抽象类是自下向上的思想

我们在定义接口时,只需要定义约束和规范,定义时不需要考虑有什么实现类或者说其实也无法遇见所有的实现类的,如果需要实现接口,那么就需要实现其定义的所有方法,所以接口的设计是从上往下的。

比如说:插头,为了各种插头在这个地区可以拥有普适性,当地会制定插头标准,每一个厂商生产这些插头的时候,虽然形式可以多样,但必须实现插头的标准,这个插头才能在这个地区适用。制定插头标准的时候,更多的考虑其规范、约束,子类的实现可能会针对基本的可行性,其他不会做太多考虑。

抽象类一般会后于实现类出现的,抽象类更多的是用来描述一组事物而产生的概念,抽象类的作用就是进行共性的提取,所以抽象类的设计是从下往上的。

比如说:动物,动物是一个抽象概念,界、门、纲、目、科、属,这些都属于不同级别的抽象类,是针对最底层的物种进行共性抽取,而一级一级产生的抽象概念,比如我们常常听到的猫科动物,就有老虎、猎豹等等。

总结

做设计的时候,抽象类和接口的选择,不应该简单地从语法层面出发,而更应该从设计思想出发,接口自上向下,抽象类自下向上。