抽象类与接口的区别
这一定是面试的热门问题!
但我不仅为这个。之前学习C#面试题,遇到过这个问题;现在学习java,也遇到这个问题,因此想总结一下。
抽象类和接口都有制定规范方法,强制子类实现的一面,很多时候,作为一个抽象父类,它们是共通的,既可以用抽象类,也可以用接口。
但不同的地方还是有很多:
1、抽象类是一个类,里面除了有抽象方法,还可以有成员变量,属性,成员函数,但接口只有待实现的方法
2、子类不一定要实现抽象类的方法,它可以原封不动地将这个方法继承下来,这时候,子类也是一个抽象类;但继承接口的子类,一定要将接口的方法实现。当然,接口也可以继承别的接口,对接口而言,是无须,也不能实现方法体的。
3、抽象类的抽象方法,不一定是public的;但接口的方法,子类实现的时候,一定要是public
4、总的看来,抽象类要比接口强大,但一个子类只能继承一个抽象类(呵呵,岂止抽象类,子类只能继承一个类而已),但可以继承多个接口
5、……
但究其实,抽象类和接口是两样不同概念的东西,它们有着本质的区别:
抽象类是从一系列相关对象中抽象出来的概念, 因此反映的是事物的内部共性;
接口是为了满足外部调用而定义的一个功能约定, 因此反映的是事物的外部特性;
分析对象,提炼内部共性形成抽象类,用以表示对象本质,即“是什么”
为外部提供调用或功能需要扩充时优先使用接口
(以上抄自互联网)
简单来说,抽象类表述的是本质,即“是什么”;接口表述的是功能,即“会什么”,或“能做什么”
我的理解:
孙悟空本质上是一个猴子,但它学会了许多本领,神通广大,成为齐天大圣。
用面向对象语言,可以这么表述:
孙悟空实现了猴子的抽象类,同时继承了一系列接口:
筋斗云,72般变化,分毫法,火眼金睛