Java的interface和abstract class都可以定义不提供具体实现的方法。其中一个类不能继承自多个abstract class,但是可以实现多个interface。Java的类没有多重继承,所以用interface的概念来补充,通过实现多个interface来实现多重的继承。 在Java中所有的对象都用类来描绘,但是不是每一个类都用来描绘对象的。用来描绘某一类对象共有的本质,这就是抽象。比如:形状存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类(这儿的抽象类并不是abstract class翻译而来的,它包括interface和abstract class)是不能够实例化的。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。 从语言层面上面来讲:abstract class可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface方式的实现中,只能够有静态的不能被修改的数据成员(也即interface是static final的),所有的成员方法都是abstract的。从这种角度来说,interface是abstarct class的一种特殊情况。abstract class可以提供某些方法的部分实现,而interface不可以,这大概就是abstract class唯一的优点吧,但这个优点非常有用。如果向一个抽象类里加入一个新的具体方法时,那么它所有的子类都一下子都得到了这个新方法,而interface做不到这一点,如果向一个interface里加入一个新方法,所有实现这个接口的类就无法成功通过编译了,因为你必须让每一个类都再实现这个方法才行。 而从设计出发:假设在我们的问题领域中有一个关于Door的抽象概念,该Door具有执行两个动作open和close,此时我们可以通过abstract class或者interface来定义一个表示该抽象概念的类型,定义方式分别如下所示:
代码
interface:
代码
其他具体的Door类型extends absract class或者implements interface就可以了。 看起来好像使用abstract class和interface没有大的区别。
但是现在如果要求Door加上报警的alarm功能,我们应该如何去设计程序的结构呢?
代码
BTW:文章借鉴了csdn的jackrong的一篇文章的例子(原文地址已经不知道了),而本身对于abstarct class和interface的理解有一部分也来自这个文章,当是我模仿加抄袭写成的文章吧。初学Java,对概念确实达不到一个高度的认识,只有通过这样的方式,希望今后可以慢慢提高…… |
abstract class 和interface
最新推荐文章于 2024-11-08 14:58:24 发布
貌似简单的东西,都很深奥,感谢楼主用精辟的话语解释了他们的区别
抽象类给我的感觉是未完成的类,但是类中某些属性和属性方法已经有了很好的实现或是解决方法,只是有部分东西不大清晰或是要看待具体情况来说,所以使用抽象方法把这个类补完。
而接口用处则大的多,面向接口编程对可插拔给予了强大的支持,在回调成员对象得到了同接口不同实现的方便。在一个功能类比较大的时候面向接口编程还可以防止编写方法的遗漏,和在编写实现之前就可以在接口中定义所有属性的好处(好比一个清单)。
但对与说继承少写代码这个说法则不是太好,继承的东西会死在你的代码里面,成为你的一部分,有变动后不方便修改,特别是对于增加某个东西的功能,并不是非要用继承,在新的类中将该功能的接口类的实现作为成员,这样就可以方便的想要什么加什么,修改维护也变的简单。
在现实的世界中也是将分工变的越来越细,一个强大功能的东西往往是多个专注于某个方向的东西组成的,计算机语言也是在模拟,特别是这些好的想法和认识。
(纯属个人学习后的想法,不对的地方希望大家指出,共同进步!)
http://junglesong.yculblog.com/post.2664685.html
继承,接口,抽象类的区别是面试官最喜欢问的问题,因为编程中常用,这里不想说那些老生常谈,只想借相声打个比方.
继承好比家学渊源,所谓"忠厚传家久,诗书继世长",家长总会潜移默化的影响下一代,下一代也会在不经意中学习前辈的特点,但因为年少分辨能力不高加上世易时移有些优点已经不再是有点甚至会变成缺点,下一代会把前辈的优缺点不分良莠的继承下来.这也是日后出现问题的根源.
接口好比拜师学艺,"入了这个门,就得说这行话",比如相声界说学逗唱四门是必须要学的,但是"师傅领进门,修行在个人",学得怎么样还全看自己,指望不费力的继承什么是不可能的,具体功夫还得个人来过. 因为是自己来,具体实现成什么样自由度也很大,比如四门功课中的"唱",原指唱太平歌词,但因为爱听的少,现在相声演员已经不要求这个了,改为唱歌唱戏的唱,其实严格界定的话是"学"的一种.这也无所谓对错,郭德刚坚持唱太平歌词也行,笑林唱流行歌曲也不错,总之实现了就可以,实现得怎么样则留给实践来检验.
抽象类则介于继承和接口之间,既可不费力的从上一代继承,也可强制实现某接口,有如某大师收自己的孩子为徒,当然相声界不让这么干,其它曲艺行业还是可以的,比如京剧界的梅兰芳和其子梅葆玖,既有言传身教,也有强制实现,综合了继承和接口的特点.
具体怎么用它们要看实际需要,如果是为了实现继承体系,当然是用继承;如果只是强制子类必须和父类统一口径,自然是用接口;如果子类说统一口径行,但必须给我些东西,那还是用抽象类不可.
解释的真好,
Abstract Class更注重的是类的属性 ...
也就是说,他所关注的是这一类东西所关注的东西,或者是需要了解的东西.也就是说,它和extend的类是定义在同一等级上的.
Interface则注重的是类是如何和外界交互的 ...
也就是说,借口关注的是类的行为,借口不需要了解类的东西.只需要反映类对外所表现.它和impl他的类不在一个等级上
给个链接阿。。。
我也来凑个热闹,转贴我的一点想法.
http://junglesong.yculblog.com/post.2664685.html
继承,接口,抽象类的区别是面试官最喜欢问的问题,因为编程中常用,这里不想说那些老生常谈,只想借相声打个比方.
继承好比家学渊源,所谓"忠厚传家久,诗书继世长",家长总会潜移默化的影响下一代,下一代也会在不经意中学习前辈的特点,但因为年少分辨能力不高加上世易时移有些优点已经不再是有点甚至会变成缺点,下一代会把前辈的优缺点不分良莠的继承下来.这也是日后出现问题的根源.
接口好比拜师学艺,"入了这个门,就得说这行话",比如相声界说学逗唱四门是必须要学的,但是"师傅领进门,修行在个人",学得怎么样还全看自己,指望不费力的继承什么是不可能的,具体功夫还得个人来过. 因为是自己来,具体实现成什么样自由度也很大,比如四门功课中的"唱",原指唱太平歌词,但因为爱听的少,现在相声演员已经不要求这个了,改为唱歌唱戏的唱,其实严格界定的话是"学"的一种.这也无所谓对错,郭德刚坚持唱太平歌词也行,笑林唱流行歌曲也不错,总之实现了就可以,实现得怎么样则留给实践来检验.
抽象类则介于继承和接口之间,既可不费力的从上一代继承,也可强制实现某接口,有如某大师收自己的孩子为徒,当然相声界不让这么干,其它曲艺行业还是可以的,比如京剧界的梅兰芳和其子梅葆玖,既有言传身教,也有强制实现,综合了继承和接口的特点.
具体怎么用它们要看实际需要,如果是为了实现继承体系,当然是用继承;如果只是强制子类必须和父类统一口径,自然是用接口;如果子类说统一口径行,但必须给我些东西,那还是用抽象类不可.