社区
Java SE
帖子详情
为什么要定义一个抽象类,里面又不存在抽象的方法,除了不能实例化之外,这样有啥用
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.多态的应用
YYWW2008
2008-12-17
打赏
举报
回复
runescape money
runescape gold
runescape power leveling
cheap runescape power leveling
rs powerleveling
runescape accounts
buy cheap runescape accounts
cheapest runescape accounts
rs accounts
runescape gold farming
runescape items
runescape gold
cheap runescape gold
buy runescape gold
runescape money
cheap runescape money
buy runescape money
runescape accounts
cheap runescape accounts
buy runescape accounts
runescape power leveling
runescape powerleveling
cheap runescape power leveling
runescape gold farming
runescape items
runescape gold
cheap runescape gold
buy runescape gold
runescape money
cheap runescape money
buy runescape money
runescape accounts
cheap runescape accounts
buy runescape accounts
runescape power leveling
runescape powerleveling
cheap runescape power leveling
runescape gold farming
runescape items
runescape gold
cheap runescape gold
buy runescape gold
runescape money
cheap runescape money
buy runescape money
runescape accounts
cheap runescape accounts
buy runescape accounts
runescape power leveling
runescape powerleveling
cheap runescape power leveling
runescape gold farming
runescape items
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]
讲得太好了,这个贴才回答到点子上了~其他贴都有点答非所问
火龙果被占用了
2008-12-16
打赏
举报
回复
如果一个类直接标上了 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)
JAVA
抽象
类
不能
实例化
为什么有构造
方法
java规定类都要有一个构造
方法
,没有默认提供一个空参构造 构造
方法
不是用来
实例化
的,而是用来给属性初始化赋值的,
抽象
方法
可以定义属性,那么就需要构造
方法
给属性赋值。这里就可以理解为什么接口没有构造
方法
了所以属性必须是常量了。
抽象
方法
需要被字类继承,字类的构造
方法
中是用super()调用父类的构造
方法
实例化
的,如果
抽象
类
没有构造
方法
,那么久无法被字类继承了。 ...
抽象
类
为什么
不能
被
实例化
?
抽象
类
不能
被
实例化
的主要原因是
抽象
类
本身存在
抽象
方法
,而
抽象
方法
没有具体的实现代码。因此,
实例化
一个
抽象
类
没有意义,因为你无法为
抽象
方法
提供具体的实现。当你创建一个
抽象
类
时,你可以在其中定义一些
抽象
方法
,然后让具体的子类来继承这个
抽象
类
并实现这些
抽象
方法
。子类必须提供这些
方法
的具体实现才能创建对象。
抽象
类
的主要作用是为其子类提供一个通用的模板和一组共享的
方法
签名,以便子类必须提供这些
方法
的具体实现。的对象可以被
实例化
,因为它提供了
抽象
方法
的实现。是一个具体的子类,它继承了。
抽象
类
和接口为什么
不能
实例化
而
抽象
类
中可以定义变量,也可以定义普通
方法
,这就要求
抽象
类
需要有构造
方法
对这些变量进行初始化,但由于
抽象
类
中存在
抽象
的
方法
,假如他能
实例化
,那他
里面
的
抽象
方法
就无法使用,因为没有
方法
体,这就使得
抽象
类
不能
实例化
。例如:我们
定义一个
狗的
抽象
类
,该类中有腿数、尾巴数等等这些属性,我们通过类中的构造函数将这些属性进行初始化。(3)子类通过继承
抽象
类
可以直接调用类中的属性,这些属性就是通过类中的构造
方法
进行初始化。个人理解:因为接口中的属性只能为常量,常量是不需要初始化的,它是存放在常量池中的。
抽象
类
不能
实例化
,那么
抽象
类
中的构造
方法
有什么意义?
在Java中,
抽象
类
的构造
方法
主要用于初始化
抽象
类
中定义的成员变量和执行一些必要的操作。虽然
抽象
类
不能
被
实例化
,但是它的子类可以通过调用父类的构造
方法
来完成对父类成员变量的初始化。总之,
抽象
类
中的构造
方法
虽然
不能
直接
实例化
,但是仍然具有重要的作用,可以为其子类提供必要的初始化和逻辑处理。此外,
抽象
类
的构造
方法
也可以用于进行安全检查和参数验证等逻辑,以保证子类
实例化
时的正确性。
“为什么
抽象
类
不能
被
实例化
?”
之前上课老师有问到过:“为什么
抽象
类
不能
被
实例化
?” 我也看了很多大佬们的帖子,都写得很好很棒!但是有一些说法我个人可能觉得有点问题: 比如:第一个观点:" 什么是
抽象
类
?
抽象
:就是不具体的意思。 类是对对象的具体描述,而
抽象
类
不具体,没有
方法
体,(提供的成员不足以生成一个具体对象),那么就无法生成一个不具体的对象。就好比,你可以
实例化
一个苹...
Java SE
62,623
社区成员
307,257
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章