抽象类有什么好处???

Ukyome 2004-04-21 03:01:02
为什么要用到抽象类和接口呢?
都说是为了符合开闭原则,但是根本就感觉无从下手去定义一个抽象类或是接口。
觉得有些多此一举了。
唉水平太低就是这样了。
有经验的人可以说说吗。
...全文
19378 51 打赏 收藏 转发到动态 举报
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
schee 2004-07-16
  • 打赏
  • 举报
回复
扩展性强!
yaray 2004-07-15
  • 打赏
  • 举报
回复
接口: 只定义方法名称,没有方法的具体实现。

抽象类: 只定义方法名称,没有方法的具体实现。 (与 接口 相同)
定义方法名称,并实现这些方法。 (与 类 相同)
以上两者都有。(真正的抽象类大多是这种方式. 可参看API源代码)

类:定义的方法必须都有实现。
jie015 2004-07-15
  • 打赏
  • 举报
回复
听课。
不过我在书上看到,说Interface比抽象类更抽象。
优先考虑接口编程。
孬毛毛 2004-07-15
  • 打赏
  • 举报
回复
觉得接口主要体现多态、可扩展性。

而抽象类主要是体现方法复用的。

~~~不知道这个理解是否正确??!!
lubin59 2004-07-14
  • 打赏
  • 举报
回复
好久不永java,都快忘光了,赶快学习一下
孬毛毛 2004-07-14
  • 打赏
  • 举报
回复
回复人: 0flying0(j2ee的狂热分子) ( ) 信誉:100 2004-4-26 19:07:37 得分: 0

其实“接口”才更有利于多态的实现的。

------------------------------------------

同意这一点~~~~~~复用、多态等特性,最根本是在接口上面体现出来的

programer23 2004-07-14
  • 打赏
  • 举报
回复
面向抽象!
huyuefox 2004-06-18
  • 打赏
  • 举报
回复
抽象类作为超类,可以将子类的公用逻辑用方法实现,而接口只是定义了实现类的规范(其实就是定义了实现类该做什么)
因此子类有公用的逻辑部分就在抽象类里实现该方法的细节,子类中有共性但实现细节不同则定义为抽象方法。抽象类只能被一个子类继承,而接口可以被多个实现类实现,所以同意楼上的接口的多态性更好
armorking2003 2004-06-17
  • 打赏
  • 举报
回复
interface表述“has a”关系,用于描述功能
是用来说明它的是实现类是“做什么?”的
至于“怎么作?”,interface并不进行约束

而abstract class表述“is a”关系,它在描述功能的同时
也通过具体实现部分功能的方式,来约束“怎么作?”
只有接受了这个约束,才应该去继承它
从而可以将“其中被具体实现的部分功能”,在它的子类中得到重用

实际使用当中,interface与而abstract class各有优势,
需要权衡。

不过,有时候,两者也可以兼用
《effective java》中提出,
可以声明一个interface描述功能,
再提供一个该接口的骨架(skeleton)实现(实现该接口的abstract class)
固化对功能实现方式的约束,从而尽可能地实现重用

于是就有了另一个问题:
在使用当中,可能发现这个skeleton实现不能满足现有需求
这时可以在原有的interface基础上,派生出另一个skeleton实现

shingle 2004-06-13
  • 打赏
  • 举报
回复
从设计上说抽象类的好处有二:
一、抽象类提供了部分实现,使子类可以重用部分抽象类的代码
二、抽象类为其子类提供了共同的接口(注意:这里说我接口与 java 中的 interface 是不同的)
也就是别人可以将各个子类的对象当成抽象类的对象使用。

我觉得“为了方便扩展”的说法是荒谬的,如果可以实现,为什么要代码写到别的类中去呢?
抽象类的关键是抽象方法,而设计抽象方法的原因是在于抽象类自己没有办法实现这个方法,
或者说在抽象类这一层,我们不知道如何实现这个方法,只有到了具体类才有办法知道实现。
如“动物”这个抽象类,有一个抽象方法“吃”,但是动物这个类是不能实现“吃这个方法的,
只有到了“人”这个类,才能有“用手将东西放进嘴里然后吞下去”这样的实现。
“动物”这个类的“吃”方法也不可能有默认的实现,因为现实中没有一个纯“动物”的实例,
它要么是“人”类的实例,要么是其它“动物”类子类的实例!
但我们一旦碰到一个“动物”对象,就可以调用“吃”这个方法,
当然我们也要预期不同对象的实现不是一样的
同桌老王 2004-06-11
  • 打赏
  • 举报
回复
是为了自己或者别人以后扩展方便。
glchengang 2004-06-11
  • 打赏
  • 举报
回复
简单的说,抽象类就是为了共用代码,没必要想得这么复杂.

http://dev.csdn.net/user/glchengang 看<一个体现Java接口及工厂模式优点的例子>

如果看了这篇文章你还是不能理解接口和抽象类的作用,告诉我,我再写.
raymond323 2004-06-09
  • 打赏
  • 举报
回复
1
rootI 2004-06-09
  • 打赏
  • 举报
回复
Refactoring
raimundo 2004-05-12
  • 打赏
  • 举报
回复
赫赫,其实如果对比C++的话就很明白了,C++由于没有接口的语法,所以继承的设计哲学里面分接口继承和实现继承两种,而java中通过语言名确了使用interface进行接口继承,那么抽象类在设计上的唯一用处就是实现继承。我比较赞同这样的设计,一般的类都final,能继承的都是abstract,决不为了减少代码作一个既可以继承也可以具体使用的类。
frean 2004-05-10
  • 打赏
  • 举报
回复
对于接口、抽象类,我的理解是:从类图出发,根据实际情况定义接口或抽象类,接口是定义行为的,任何一个类都可以看作有一个接口,如果需要可以定义接口,否则不需要定义,而抽象类是可以定义和实现行为,但不能执行行为,因为它不能实例化,但可以定义对象,这个对象的行为是抽象类的实现类的实例的行为。
yuannauy 2004-05-10
  • 打赏
  • 举报
回复
那又什么时候使用“回调”呢?
MaiCle 2004-05-07
  • 打赏
  • 举报
回复
gleaf() :具体类不是用来继承的!

Scott Meyers曾指出:只要有可能,不要从具体类继承
java_alias 2004-05-05
  • 打赏
  • 举报
回复
匆忙上网,收藏先,有空慢慢看
gleaf 2004-05-05
  • 打赏
  • 举报
回复
回复人: ai92(抵制日货!!) ( ) 信誉:96 2004-04-23 01:35:00 得分:0


再来一个:
假如很多人要买水果吃,吃的动作只有一个,但是有的人要用现金买,有的人用信用卡,有的人赊帐。要为每个人定义一个类,就要定义多个相同的吃的方法。如果定义一个抽象类,在里面实现吃的方法,再做一个买的抽象方法。那每个人的类都从这个抽象类派生下来,只要实现买的方法即可,吃的方法就可以直接用父类的方法了。如果要改吃的方法就不用改多个,只要改这个抽象类里的就行了。

=============================================================

不同意,在这里也可以用普通类作为父类,在这个例子不一定要用抽象类,也可以用普通类。

=============================================================
在这个例子里可以使用普通类,此时“吃”方法需要被声明为抽象方法。
在这个类里面可能同时存在抽象方法和普通(现实)方法。有点不爽
就一般而言,仍然可以把这里的抽象方法从普通类里面分离出来,形成一个接口。而普通类实现接口。如此就把现实世界中的“抽象”和“具体”完全分离,有益于代码的可读性和可重用性。
加载更多回复(31)
自己整理的C++要背的一些概念,华南师范大学考c++的建议看看,21届考研有考到哦!!(可打印版) 1. 面向对象的三个基本特征 4 2. 抽象 4 3. 如何实现多态性 4 4. const与define的区别 4 5. static作用 4 6. 静态数据成员与静态成员函数 5 7. 静态数据成员与全局变量的不同 5 8. 为什么引入友元的概念? 5 9. 什么是友元函数? 5 10. 友元成员函数 5 11. 友元类 5 12. 函数重载 5 13. 运算符重载 6 14. 运算符重载函数的使用 6 15. 重载运算符的规则 6 16. 为什么要使用继承 6 17. 保护成员的作用 6 18. 多重继承 6 19. 虚基类及其作用 6 20. 派生类的构造函数和析构函数的构造规则 7 21. 虚函数及其作用 7 22. 静态关联和动态关联 7 23. 函数重载与虚函数的不同 7 24. 虚析构函数 8 25. 纯虚函数 8 26. 抽象类 8 27. 抽象类与接口的区别 8 28. 32.输入输出流 8 29. 标准的输出流对象有哪些 8 30. 标准的输入流对象有哪些 9 31. 文件流类与文件流对象 9 32. 两个短整型数相加后,结果是什么类型? 9 33. 什么是值传递? 9 34. 值传递、引用传递和指针传递的区别是什么? 9 35. 什么是函数模板?什么是模板函数?函数模板有什么用途? 9 36. C++是如何实现函数重载的? 10 37. 全局变量和局部变量的主要区别是什么? 使用全局变量有什么好处?有什么坏处? 10 38. 变量定义和变量声明有什么区别? 10 39. 引入结构体有什么好处? 10 40. 单链表中为什么要引入头结点? 10 41. 结构体类型定义的作用是什么? 结构体类型的变量定义的作用是什么? 10 42. 用自己的话描述逐步细化的过程 10 43. 为什么库的实现文件要包含自己的头文件? 11 44. 什么头文件要包含 #ifndef...#endif这对编译预处理指令? 11 45. 为什么要使用库? 11 46. 用struct定义类型与用class定义类型有什么区别? 11 47. 构造函数和析构函数的作用是什么?它们各有什么特征? 11 48. 友元的作用是什么? 11 49. 静态数据成员有什么特征?有什么用途? 11 50. 在定义一个类时,哪些部分应放在头文件(.h文件)中,哪些部分应放在实现文件(.cpp文件)中? 12 51. 什么情况下类必须定义自己的复制构造函数? 12 52. 常量数据成员和静态常量数据成员有什么区别?如何初始化常量数据成员?如何初始化静态常量数据成员? 12 53. 什么是this指针?为什么要有this指针? 12 54. 复制构造函数的参数为什么一定要用引用传递,而不能用值传递? 12 55. 构造函数为什么要有初始化列表? 12 56. 如何区分++和--的前缀用法和后缀用法的重载函数? 12 57. 类有几个默认的成员函数? 13 58. 什么是抽象类?定义抽象类有什么意义? 抽象类在使用上有什么限制? 13 59. 为什么要定义虚析构函数? 13 60. 试说明派生类对象的构造和析构次序。 13 61. 试说明虚函数和纯虚函数有什么区别 13 62. 基类指针可以指向派生类的对象, 为什么派生类的指针不能指向基类对象? 13 63. 如果一个派生类新增加的数据成员中有一个对象成员,试描述派生类的构造过程 13 64. 为什么函数模板的使用与普通的函数完全一样, 而类模板在使用时还必须被实例化? 13 65. 类模板继承时的语法与普通的类继承有什么不同? 13 66. 什么是打开文件?什么是关闭文件?为什么需要打开和关闭文件? 14 67. 为什么要检查文件打开是否成功?如何检查? 14 68. ASCII文件和二进制文件有什么不同? 14 69. C++有哪4个预定义的流? 14 70. 什么时候用输入方式打开文件?什么时候应该用输出方式打开文件?什么时候该用app方式打开文件? 14 71. 哪些流操纵符只对下一次输入/输出有效?哪些流操纵符是一直有效直到被改变? 14 72. 什么叫做作用域?什么叫做局部变量? 什么叫做全局变量? 14

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧