接口和抽象类的区别(abstract和interface的区别)

2019-12-11

首先接口和抽象类的设计目的就是不一样的。

接口是对动作的抽象,而抽象类是对根源的抽象。

  • 对于抽象类,比如男人,女人这两个类,那我们可以为这两个类设计一个更高级别的抽象类–人。
  • 对于接口,我们可以坐着吃饭,可以站着吃饭,可以用筷子吃饭,可以用叉子吃饭,甚至可以学三哥一样用手抓着吃饭,那么可以把这些吃饭的动作抽象成一个接口–吃饭。

所以在高级语言中(如Java, C#),一个类只能继承一个抽象类(因为你不可能同时是生物又是非生物)。

但是一个类可以同时实现多个接口,比如开车接口,滑冰接口,踢足球接口,游泳接口。

  Abstract class 抽象类 Interface 接口
实例化 不能 不能
类 一种继承关系,一个类只能使用一次继承关系。 可以通过继承多个接口实现多重继承 一个类可以实现多个interface
数据成员 可有自己的 静态的不能被修改即必须是static final修饰
方法 可以私有的, 只有那些冠有abstract的方法才是抽象的,子类必须实现 不可有私有的, 默认是public,abstract 类型
变量 可有私有的,默认是friendly型, 其值可以在子类中重新定义,也可以重新赋值 不可有私有的,默认是public static final 型, 且必须给其初值,实现类中不能重新定义,不能改变其值。
设计理念 表示的是“is-a”关系 表示的是“like-a”关系
设计目的 是代码复用。当不同的类具有某些相同的行为(记为行为集合A),且其中一部分行为的实现方式一致时(A的非真子集,记为B),可以让这些类都派生于一个抽象类。在这个抽象类中实现了B,避免让所有的子类来实现B,这就达到了代码复用的目的。而A减B的部分,留给各个子类自己实现。正是因为A-B在这里没有实现,所以抽象类不允许实例化出来(否则当调用到A-B时,无法执行) 是对类的行为进行约束(更准确的说是一种“有”约束,因为接口不能规定类不可以有什么行为),也就是提供一种机制,可以强制要求不同的类具有相同的行为。它只约束了行为的有无,但不对如何实现行为进行限制。对“接口为何是约束”的理解,我觉得配合泛型食用效果更佳
实现 需要继承,要用extends 要用implements