接口和抽象类的区别(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