请大家讨论一下接口和抽象类的使用,
即在什么情况下用接口比较好,
什么时候用抽象类比较好,
为什么,给出理由,谢谢!
如果可以文字代码结合最好,多多加分。
^_^
抽象类指有一些方法还没实现在,只需在类里声明。
接口是抽象类的极端表现形式,当没有任何部分功能已实现的时候,就用接口。
用abstract来声明类时,即使这个类中一个abstract函数也没有,你也可以这样作,目的是:不想这个类能被创建出实例。
你可以去看一本书JAVA 设计模式,里面讲得很清楚。接口和抽象类区别
1、如果你的实现中包含了大量一抹一样的代码,那么建议用抽象类,可以在其中定义一些比不变的方法。同样,如果你的实现中只是有一些对外的公共接口,而具体实现变化颇大,则应该使用接口。
2、接口是抽象类的进一步抽象化。
3、Java中只能单继承,不过如果你使用接口技术的话,可以实现多重继承。
4、用抽象类可以实现模板方法的设计模式。
java设计思想:接口与抽象类优先考虑接口!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
java与模式这本书中有说明
抽象类的继承性是接口所不能比拟的:
BaseClass--->subBaseClass---->subSubClass
subBaseClass 由抽象类BaseClass继承而来,可以重写所有的方法,
subSubClass 由subBaseClass继承而来,可以直接继承subBaseClass已重写的方法.
接口的实现则必须逐个实现
我的想法不知道对否??
abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意。其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否正确、合理。
abstarct class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is a"关系,即父类和派生类在概念本质上应该是相同的中有关于"is a"关系的大篇幅深入的论述,有兴趣的读者可以参考)。对于interface 来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了interface定义的契约而已。
从编程层面看abstract class和interface
从编程的角度来看,abstract class和interface都可以用来实现"design by contract"的思想。但是在具体的使用上面还是有一些区别的。
首先,abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。也许,这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。
其次,在abstract class的定义中,我们可以赋予方法的默认行为。但是在interface的定义中,方法却不能拥有默认行为,为了绕过这个限制,必须使用委托,但是这会增加一些复杂性,有时会造成很大的麻烦。
在抽象类interface中不能定义默认行为还存在另一个比较严重的问题,那就是可能会造成维护上的麻烦。因为如果后来想修改类的界面以适应新的情况时,就会非常的麻烦,可能要花费很多的时间。但是如果界面是通过abstract class来实现的,那么可能就只需要修改定义在abstract class中的默认行为就可以了。
同样,如果不能在抽象类中定义默认行为,就会导致同样的方法实现出现在该抽象类的每一个派生类中,违反了"one rule,one place"原则,造成代码重复,同样不利于以后的维护。因此,在abstract class和interface间进行选择时要非常的小心。
其实很简单,优先选用接口,因为它最单纯。如果大家有公用的代码的话,就用抽象类。