以下是引自CSDN中Dan1980 的回帖!!!

个人认为在解释抽象类和接口时,应该强调其区别,弱化其共同点。因为这两者确实不是一个层面上的概念。
遗憾的是,现在国内很多解释往往认为两者作用相当,甚至混为一谈。

抽象类的实际存在意义比很多人想象的要小得多,其实它就是一个“半成品”的类,和一般类一样,但是不能直接实例化,因为它是半成品。
其实,抽象类也可以是一个完全的“成品”,但是你不能把它当作成品来用。

而要理解接口,则需要更多的抽象思维能力。
类可以说是对象实例的一个完整模版,因为实例所拥有的属性和行为与类中定义的完全一致。
而接口则可以说是一个完整模版的某一或某些部分,这些部分因为具有某种关联而被定义在一个interface中。

最让初学者困惑就是:为什么接口中定义的方法,在其实现类中还要重新定义一次?而不是像继承那样,直接可以得到?接口的存在似乎可有可无。

要回答这个问题,需要涉及到接口的作用问题。接口不是让其实现类得到某种特性,而是让其它的类可以从某个侧面去观照这个类,从而实现类间通信的目的。接口的作用如同它的名字一样,是用来对接的。所以,“实现接口”只是体现了接口作用的一部分,另一部分则是“使用接口”。

还有一个我觉得很容易引起误解的解释在周围很流行,就是把超类和派生类的关系解释成父亲和儿子的关系,个人认为这是非常不恰当的。
超类比派生类具有更多的抽象性,而父亲和儿子在抽象性层面上一致的。
所以,我在平时用语中很少用“父类”和“子类”这两个词,写代码时也很少用Parent表示超类,Child表示派生类。
大家可以参考一些权威著作,大多是用Base和Inherited等作为类名。


以下是 hmsuccess 的回帖

引用:
接口只定义了应该做什么,而没有定义该怎么做 

所以,如果你的程序只有你一个人完成,且每个功能只有一种实现的方法,我想你可以,注意是可以,不用接口 

如果有多人合作,你可能开发的快,可惜你需要的一个类,你的同伴还没有完成,你怎么办?等他吗? 
如果是面向接口,你可以自己先写一个最简单的实现来调试你的代码,Spring这时是个好帮手。 

如果一个功能有多种实现,比如导出文档。 有的要html的,有的是word/Excel/PPt/PDF 等等。 
因为你无法预见他们到底需要什么,这时候,你可以用接口,要求每个实现只需要完成 export 方法就行。 
然后你自己做了一个Excel的,以后按需要再完成其他的,而此时,你原来的程序根本不用修改,因为他们调用的是接口,而不是具体的某个实现类。

1.抽象类是一个不完全的类,需要进一步专业化.接口只是一个行为的规范或规定; 
2.接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法; 
3.一个类一次可以实现若干个接口,但是只能扩展一个父类 
4.接口可以用于支持回调,而继承并不具备这个特点. 


如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单易行的方法来控制组件版本。通过更新基类,所有继承类都随更改自动更新。另一方面,接口一旦创建就不能更改。如果需要接口的新版本,必须创建一个全新的接口。 
如果创建的功能将在大范围的全异对象间使用,则使用接口。
抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。 
如果要设计小而简练的功能块,则使用接口。
如果要设计大的功能单元,则使用抽象类。 
如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。抽象类允许部分实现类,而接口不包含任何成员的实现。

接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的, 

另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。 

还有,接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用.

举例:
狗叫,猫叫,   对于叫就是一种接口。
狗叫,猫叫,花猫叫。。这时候定义个抽象类比较好。 因为花猫继承猫的,所以比较有层次感。
posted on 2008-03-19 14:39  李小鱼  阅读(173)  评论(0编辑  收藏  举报