首先接口和抽象类的设计目的就是不一样的。
接口是对动作的抽象,而抽象类是对根源的抽象。
- 对于抽象类,比如男人,女人这两个类,那我们可以为这两个类设计一个更高级别的抽象类–人。
- 对于接口,我们可以坐着吃饭,可以站着吃饭,可以用筷子吃饭,可以用叉子吃饭,甚至可以学三哥一样用手抓着吃饭,那么可以把这些吃饭的动作抽象成一个接口–吃饭。
所以在高级语言中(如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 |