为什么要定义一个抽象类,里面又不存在抽象的方法,除了不能实例化之外,这样有啥用

pxhoonet 2008-12-16 05:52:57
今天面试时被人问到的
...全文
1144 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
jackery0114 2008-12-17
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 bigbro001 的回复:]
引用 22 楼 xiaozhimin1978 的回复:
可以这么理解

可以确定某个类型一定会有一种操作,但是这个类型上还不能确定这个操作具体应该如何执行,而要延伸到它的子类才可以确定

比如说在一个模型中,有一个 Employee 类,可以肯定的是 Employee 都应该会有一个 doWork 方法,也就是企业员工都要工作
但是,这个工作具体应该如何做,则需要到更精确的类型才可以确定。比如“清洁工”是公司里的一个员工,他们的 doWork 方法…
[/Quote]

这个说的不错,我找到篇关于抽象类的基础文章你也可以了解下
深入的理解abstract class:http://www.j2mehome.com/J2EE/20080229/813.html
simonhehe 2008-12-17
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 bigbro001 的回复:]
总结一下大家说的抽象类好处:
1.增加程序的可扩展性
2.增加程序的可维护性
3.多态的应用
[/Quote]
bigbro001 2008-12-17
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 xiaozhimin1978 的回复:]
可以这么理解

可以确定某个类型一定会有一种操作,但是这个类型上还不能确定这个操作具体应该如何执行,而要延伸到它的子类才可以确定

比如说在一个模型中,有一个 Employee 类,可以肯定的是 Employee 都应该会有一个 doWork 方法,也就是企业员工都要工作
但是,这个工作具体应该如何做,则需要到更精确的类型才可以确定。比如“清洁工”是公司里的一个员工,他们的 doWork 方法就可以确定是打扫卫生;Sales 的 doWo…
[/Quote]

不错,很形象
bigbro001 2008-12-17
  • 打赏
  • 举报
回复
总结一下大家说的抽象类好处:
1.增加程序的可扩展性
2.增加程序的可维护性
3.多态的应用
xinming1558 2008-12-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 twinsouzhili 的回复:]
抽象类是不能够实例化的类:
它的作用就是产生子类的同时给于子类一些特定的属性和方法.
来个简单的例子...
如果你的程序里面需要用到苹果和梨这2个类..那么你可以分别给出这2个类
但是你会发现这2个类里面有共同的属性和方法(属性: 都有核.. 方法: 都需要削皮吃...)那么你可以建立抽象类 "水果" 把这些共同的东西都定义在那里. 那么你的2个子类就只需要实其他必要的东东了(味道, 价格...)

优点: 当你需要对苹果和梨做…
[/Quote]
很好。。
sunrise2199 2008-12-17
  • 打赏
  • 举报
回复
学习
财富实验室 2008-12-17
  • 打赏
  • 举报
回复
向上转型!
bigbro001 2008-12-17
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 spiniper 的回复:]
一般来说如果抽象类中总要有些抽象方法去让子类实现,但是没有抽象方法的抽象类就和普通类差不多了,除了不能实例化以外,其实这就是限制用户此类不能实例化,必须有子类。
从设计角度上来说告诉类调用者,这个地方的类是用来扩展的而不是用来使用的,即使类调用者不打算覆盖抽象类的方法,这样做有一个好处就在于,抽象方法必须要实现,而实方法可以不用实现。类调用者只用覆盖那些需要的方法,不需要的方法就不用覆盖了。

[/Quote]

讲得太好了,这个贴才回答到点子上了~其他贴都有点答非所问
  • 打赏
  • 举报
回复
如果一个类直接标上了 abstract,这也表明类的设计者不想让人直接使用这个类,如果其中的方法大多数都是 protected 的,
那也说明这个方法得让别人来继承之后重写。总之,abstract 这种类就是为了让别人继承而存在的。

一般来说一个类不让直接 new 产生对象有两种方式,一种是 abstract,另一种是将构造方法置为 private。前者的冗余度和扩
展性都很高,其他的类可以继承,增加,甚至重写其中的方法。而 private 构造方法就很绝对了,不允许别人去继承和修改其
中的东西。
ZiSheng 2008-12-16
  • 打赏
  • 举报
回复
还有就是,用一个抽象类实现很多的相关接口,你在用到这些接口的时候就可以继承这个没有抽象方法的抽象类,一切都是为了
开发的快捷,方便。
ZiSheng 2008-12-16
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 spiniper 的回复:]
一般来说如果抽象类中总要有些抽象方法去让子类实现,但是没有抽象方法的抽象类就和普通类差不多了,除了不能实例化以外,其实这就是限制用户此类不能实例化,必须有子类。
从设计角度上来说告诉类调用者,这个地方的类是用来扩展的而不是用来使用的,即使类调用者不打算覆盖抽象类的方法,这样做有一个好处就在于,抽象方法必须要实现,而实方法可以不用实现。类调用者只用覆盖那些需要的方法,不需要的方法就不用覆盖了。

[/Quote]
说的对,是这样,因为如果一个抽象类有很多抽象的方法的话,在继承的时候我们必须得实现所有的方法,如果你又加了一层
就是这种没有抽象方法的抽象类,你想用那个方法就重写那个方法,而不用重写所有的方法,awt中事件监听中有很多这样的
类,就是所谓的“适配器”
xiaozhimin1978 2008-12-16
  • 打赏
  • 举报
回复
可以这么理解

可以确定某个类型一定会有一种操作,但是这个类型上还不能确定这个操作具体应该如何执行,而要延伸到它的子类才可以确定

比如说在一个模型中,有一个 Employee 类,可以肯定的是 Employee 都应该会有一个 doWork 方法,也就是企业员工都要工作
但是,这个工作具体应该如何做,则需要到更精确的类型才可以确定。比如“清洁工”是公司里的一个员工,他们的 doWork 方法就可以确定是打扫卫生;Sales 的 doWork 则是和客户谈生意等。
而在很多时候,我们要关注的是对象更加“泛”的类型,而不是更精确的类型。比如公司老板在招集员工开了一个短会之后,宣布散会,然后大家回去继续工作,也就是将用全体员工对象的 doWork 方法调用一次。在这里,老板在调用 doWork 方法时关注的是它的父类型,而不是子类类型,他没兴趣也没有必要去判断每个员工的子类型是什么。



这种思想在 jdk 的类库中多有体现。
比如 java.io.InputStream 类是一个抽象类,它的 read() 方法是一个抽象方法,它用于从输入流中读取一个字节的数据。
然而在 java 中,无论从网络还是从文件中读取数据都是用 Stream 类,显然文件和网络数据流的读取操作是不一样的。但是无论是网络还是文件,可以确定的是InputStream 一定会有一个 read() 方法用于从流中读取一个字节的操作。所以 InputStream 被定义成抽象类,read 方法被定义为抽象方法。read 方法是由它们的子类来完成的,文件的read方法由FileInputStream 类实现,网络输入流则是由 Socket.getInputStream 方法得到的 InputStream 的一个子类来对象来实现的。

gongfuliang 2008-12-16
  • 打赏
  • 举报
回复
用于继承,主要是定义一些公共的属性和方法。

用户必须实例化其实现子类,才能使用这些使用,或者调用这些方法
shuaiAWP 2008-12-16
  • 打赏
  • 举报
回复
AWT用了很多抽象类
抽象类与接口是分不开的
有的时候你不想实现接口里的所有方法
就用抽象类对其进行空实现
你在继承抽象类,可以只重写其中的一种或几种,而不用重写全部
树成 2008-12-16
  • 打赏
  • 举报
回复
一般来说如果抽象类中总要有些抽象方法去让子类实现,但是没有抽象方法的抽象类就和普通类差不多了,除了不能实例化以外,其实这就是限制用户此类不能实例化,必须有子类。
从设计角度上来说告诉类调用者,这个地方的类是用来扩展的而不是用来使用的,即使类调用者不打算覆盖抽象类的方法,这样做有一个好处就在于,抽象方法必须要实现,而实方法可以不用实现。类调用者只用覆盖那些需要的方法,不需要的方法就不用覆盖了。
其实jdk内部有很多这样的方法,例如事件侦听的适配器类就是这样,它们都空实现了侦听接口,这有助于用户实现接口时不用去费力的去实现那些抽象方法。
ccc_moriya 2008-12-16
  • 打赏
  • 举报
回复
其实综上所述就是啦,多态性,扩展,还有后期的修改,有些在小程序里是体现不出来的。。。
xiaozhuaizhuai 2008-12-16
  • 打赏
  • 举报
回复
OO思想
pxhoonet 2008-12-16
  • 打赏
  • 举报
回复
先不结贴,大家还有什么不同想法么
pxhoonet 2008-12-16
  • 打赏
  • 举报
回复
明白了,其实将它定义为抽象类就是因为这个类实例化了没有意义,
因为类已经定义好了不能改里面的方法体,所以实例化出来的对象根本完成不了所需的功能要求,
只有继承他的子类重写里面的方法之后才有意义,所以把这个类定义为没有抽象方法的抽象类。
http://www.java3z.com/cwbwebhome/article/article2/2906.html?id=1567
加载更多回复(14)

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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