抽象类和接口的区别

首先,我感觉这篇文章最重要的应该是不同点的第二条,抽象类和接口的设计目的,为什么不同,而不是下面这些细枝末节的细节,毕竟这些细节都是由设计的初衷衍生的。

具体可以看下这篇文章:
http://www.cnblogs.com/webary/p/5057237.html
另外,我们的代码里抽象类的应用经常出现在多个类有共同之处的情况,比如两个tab页面都有类似的加载流程。

下面的内容看看就好。


共同点:

  1. 不能被实例化,都位于继承树的顶端,用于被其他类实现和继承。
    (关于这一点,我有时候会疑惑,常用的setXXXListener的参数new onXXXListener()难道不就是实例化一个接口吗,其实不是的,而是实例化了一个实现了接口的匿名内部类)。
  2. 都包含抽象方法,实现接口 或 继承抽象类 的普通子类,都必须实现这些抽象方法。
    (抽象类当然也可不不包含抽象方法,但不包含抽象方法就没必要弄成抽象类了。。。)

不同点:

  1. 接口支持多继承,可以extends interfaceA, interfaceB。
    (这还是蛮震惊的发现,原来interface是可以多extends的,之前以为只是class可以多implements。另外,interface是不能implements另一个interface的,毕竟是「实现」嘛,接口又不能实现具体函数体)

  2. 设计目的也不同,接口作为系统与外界交互的窗口,体现的是一种规范。而抽象类作为系统中多个子类的共同父类,他体现的是一种模板式设计。
    (比如例子,门有的open,close方法要放在抽象类里,但是alarm这种不是每个门都有的方法就放到接口里。其实这个例子也不太恰当)

  3. 设计目的也不同,接口作为系统与外界交互的窗口,体现的是一种规范。而抽象类作为系统中多个子类的共同父类,他体现的是一种模板式设计。
    (这一点比较容易理解吧,抽象类更灵活一些,可以有一部分实现,而接口是完全的抽象)

  4. 接口里只能定义静态常量,不能定义普通成员变量。抽象类里则既可以定义普通成员变量,也可以定义静态常量。

  5. 接口里不包含构造器;抽象类里可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让子类调用。

  6. 接口里不能有初始化快,而抽象类则可以有。


https://zhuanlan.zhihu.com/p/26146366

你可能感兴趣的:(抽象类和接口的区别)