基本区别

  • 抽象类可以存在普通成员函数,而接口中只能存在public abstract方法;
  • 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
  • 抽象类只能集成一个,接口可以实现多个。

设计目的

接口:接口的设计目的,是==对类的行为进行约束==,也就是提供了一种机制,可以强制要求不同的类具有相同的行为。它只约束了行为的有无,但不对如何实现行为进行限制。

抽象类:抽象类的设计目的,是==代码复用==。当不同的类具有相同的行为(记录为行为集合A),且其中一部分的行为的实现方式一致时(A的非真子集,记为B),可以让这些类都派生于同一个抽象类。在这个抽象类中实现B,避免让所有的子类来实现B,这就达到了代码复用的目的。而A减B的部分,留给各个子类自己实现。正是因为A减B这部分抽象类没有实现,所以抽象类不允许实例化,否则出现调用【A-B】方法时无法执行。

==个人理解:== 感觉新的版本下,接口也可以实现代码复用的目的,比如说两个接口分别实现==同样的默认方法==methodCom01(),在实现其他接口时,可以调用methodCom01()这个方法,通过继承不同的接口,达到调用不同实现的方式,因为methodCom01()具有通用性,可以进行更多的组合操作。

抽象的对象

抽象类:抽象类是==对类本质的抽象,表达的是 is a 的关系==,比如:BMW is a Car。抽象类包含并实现子类的通用特性,将子类存在差异化的特性进行抽象,交由子类去实现。

接口:接口是对行为的抽象,表达的是 like a 的关系,比如:Bird like a Aircraft(鸟像飞行器一样可以飞),但其本质是个鸟。并且具体怎么飞也不一样。接口的核心是定义行为,即实现类可以做什么,至于实现类主体是谁,是如何实现的,接口并不关心。

使用场景

当你关注一个事物的本质时,用抽象类;

当你关注一个操作时,用接口;