首先,我感觉这篇文章最重要的应该是不同点的第二条,抽象类和接口的设计目的,为什么不同,而不是下面这些细枝末节的细节,毕竟这些细节都是由设计的初衷衍生的。
具体可以看下这篇文章:
http://www.cnblogs.com/webary/p/5057237.html
另外,我们的代码里抽象类的应用经常出现在多个类有共同之处的情况,比如两个tab页面都有类似的加载流程。
下面的内容看看就好。
共同点:
-
不能被实例化,都位于继承树的顶端,用于被其他类实现和继承。
(关于这一点,我有时候会疑惑,常用的setXXXListener的参数new onXXXListener()难道不就是实例化一个接口吗,其实不是的,而是实例化了一个实现了接口的匿名内部类)。 -
都包含抽象方法,实现接口 或 继承抽象类 的普通子类,都必须实现这些抽象方法。
(抽象类当然也可不不包含抽象方法,但不包含抽象方法就没必要弄成抽象类了。。。)
不同点:
接口支持多继承,可以extends interfaceA, interfaceB。
(这还是蛮震惊的发现,原来interface是可以多extends的,之前以为只是class可以多implements。另外,interface是不能implements另一个interface的,毕竟是「实现」嘛,接口又不能实现具体函数体)设计目的也不同,接口作为系统与外界交互的窗口,体现的是一种规范。而抽象类作为系统中多个子类的共同父类,他体现的是一种模板式设计。
(比如例子,门有的open,close方法要放在抽象类里,但是alarm这种不是每个门都有的方法就放到接口里。其实这个例子也不太恰当)设计目的也不同,接口作为系统与外界交互的窗口,体现的是一种规范。而抽象类作为系统中多个子类的共同父类,他体现的是一种模板式设计。
(这一点比较容易理解吧,抽象类更灵活一些,可以有一部分实现,而接口是完全的抽象)接口里只能定义静态常量,不能定义普通成员变量。抽象类里则既可以定义普通成员变量,也可以定义静态常量。
接口里不包含构造器;抽象类里可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让子类调用。
接口里不能有初始化快,而抽象类则可以有。