本质上的区别,接口----负责暴露必要的操作给用户,至于这些操作具体怎么实现则由专门的实现类去完成,Abstract类是实现了部分操作但是还不完全的就是一个半成品.
这样来形容吧,如果把编程看成是造房子,哪么接口interface room就相当于一个总体设计,负责把房屋的要提供主要功能确定下来,比如房子要提供卧室能用来睡觉,哪好就定义一个方法applyBedroom(),房子还要提供淋浴,再来一个方法shower()....;
至于房子功能由谁来,用什么来实现那就是具体实现类的事情了,而Abstract Class 则是完成了部分功能的一个半成品,最最重要的是Abstract Class 是不能实例化的也就是不能拿来用,道理很简单,半成品的房子谁会用来住?Abstract Class 是让他的继承类来继续完成其未完成的工作,当然他的继承类也可以是Abstract Class,知道最后这个房子造好即功能被完全实现.当然这个接口的实现类可以有很多,比如豪华别墅,普通民房,集体宿舍...
然后利用接口和多态,我们可以Ioc(控制反转),我们可以dynamic proxy(动态代理),我们可以Aop(面向切面) .....
接口里不能有任何一个已经实现了的方法,而抽象类则是,只要有一个没有实现了的方法,就是抽象类。可以简单的说,接口就是一种特殊的抽象类。
接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的,
另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。
还有,接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用.
在abstract class方式中,Demo可以有自己的数据成员,也可以有非 abstract的成员方法,而在interface方式的实现中,Demo只能够有静态的不能被修改的数据成员(也就是必须是static final 的,不过在interface中一般不定义数据成员),所有的成员方法都是abstract的。从某种意义上说,interface是一种特殊形式的 abstract class。
从编程的角度来看,abstract class和interface都可以用来实现 "design by contract" 的思想。但是在具体的使用上面还是有一些区别的。
首先,abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系(因为Java不支持多继承 -- 转注)。但是,一个类却可以实现多个interface。也许,这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。
其次,在abstract class的定义中,我们可以赋予方法的默认行为。但是在interface的定义中,方法却不能拥有默认行为,为了绕过这个限制,必须使用委托,但是这会增加一些复杂性,有时会造成很大的麻烦。
在 抽象类中不能定义默认行为还存在另一个比较严重的问题,那就是可能会造成维护上的麻烦。因 为如果后来想修改类的界面(一般通过 abstract class 或者interface来表示)以适应新的情况(比如,添加新的方法或者给已用的方法中添加新的参数)时,就会非常的麻烦,可能要花费很多的时间(对于派生类很多的情况,尤为如此)。但是如果界面是通过abstract class来实现的,那 么可能就只需要修改定义在abstract class中的默认行为就可以了。
同样,如果不能在抽象类中定义默认行为,就会导致同样的方法实现出现在该抽象类的每一个派生类中,违反了 "one rule,one place" 原则,造成代码重复,同样不利于以后的维护。因此,在abstract class和interface间进行选择时要非常的小心。
从设计理念层面看 abstract class 和 interface
上面主要从语法定义和编程的角度论述了abstract class和interface的区别,这些层面的区别是比较低层次的、非本质的。本小节将从另一个层面:abstract class和interface所反映出的设计理念,来分析一下二者的区别。作者认为,从这个层面进行分析才能理解二者概念的本质所在。
抽象类可以有实现的方法,而接口不能。。。
可以这么说,接口是完全抽象的类。。当然并不十分准确
抽象类是类,所以只能被单继承,而接口可以被多继承,比较灵活一点