A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© straw 中级黑马   /  2013-9-9 00:32  /  2620 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 潘才新 于 2013-9-12 23:18 编辑

抽象类不能被实例,因为抽象类是描述现实中的抽象事物.那为什么抽象类中还要存在构造函数?而且还可以定义有参构造函数,在子类中用super(...)来调用对应的构造函数.在子类被实例的时候抽象父类的无参构造函数也会被调用,难道保留抽象类的构造函数是为了初始化代码块?但是在子类的构造函数中完全可以实现这个功能.那为什么还要在抽象类中保留构造函数呢?如果去除了抽象类的构造函数,那么子类在实例的时候就不再调用该方法(减轻资源损耗),子类的成员super中也不在包含构造成员,从而可以达到程序的精简作用.

评分

参与人数 1技术分 +1 收起 理由
潘才新 + 1

查看全部评分

10 个回复

倒序浏览
1.首先你要搞清楚java里new这个关键字,new说的是要调用构造方法,分配内存空间,创建实例,抽象类是不允许new的,但是抽象类可以有构造方法,我们知道通常创建类的实例需要new 类();这种形式,但是只能说new调用构造方法才是创建对象,而抽象类不可以有实例,但是可以调用构造方法,因为它不是new调用,而是通过new子类,根据依赖关系,自动调用的

评分

参与人数 1技术分 +1 收起 理由
潘才新 + 1 赞一个!答得不错

查看全部评分

回复 使用道具 举报
亲,如问题已解决请将分类的“未解决”改为“已解决”。
以后的问题贴也要及时更改分类哦~
回复 使用道具 举报
楼主绕口令的话比我看代码还晕,只看了第一句,抽象类只有被继承才有意义,子类会自动调用父类的空参构造方法,所以抽象类是一定有构造函数的
回复 使用道具 举报
吃阁子的猫 发表于 2013-9-9 15:18
楼主绕口令的话比我看代码还晕,只看了第一句,抽象类只有被继承才有意义,子类会自动调用父类的空参构造方法, ...

呵呵  我是想问抽象类为什么不去除构造函数?保留构造函数在抽象类中还有什么其他意义?   

我是想把我的思路从头到脚都说出来,然后在提出问题,没想到让人看起来更是费解!以后尽量简洁!
回复 使用道具 举报
吕振中 发表于 2013-9-9 08:21
1.首先你要搞清楚java里new这个关键字,new说的是要调用构造方法,分配内存空间,创建实例,抽象类是不允许 ...

创建子类对象的时候回去调用父类的空参构造函数,可是这个构造函数体中既没有代码块,也没有去创建实例.等于调用这个函数却什么事都不干!
但抽象类中却始终都保留构造函数,难道抽象类的构造函数还有其他意义?
回复 使用道具 举报
straw 发表于 2013-9-9 19:09
呵呵  我是想问抽象类为什么不去除构造函数?保留构造函数在抽象类中还有什么其他意义?   

我是想把我的 ...

不是这个意思,呵呵,是我今天脑袋有点晕,当然是讲的越清楚越好
回复 使用道具 举报
straw 发表于 2013-9-9 19:16
创建子类对象的时候回去调用父类的空参构造函数,可是这个构造函数体中既没有代码块,也没有去创建实例.等 ...

子类既然继承了父类,就会先看父类是如何初始化的,根据父类的一些成员.方法啊,在确定自己是否要做一些特有的操作,所以调用父类的构造方法是必要的

评分

参与人数 1技术分 +1 收起 理由
潘才新 + 1

查看全部评分

回复 使用道具 举报
抽象类也是类,类中就要有构造方法吧,我这么认为.不知道理解对不对
回复 使用道具 举报
抽象类有构造用来给子类对象初始化用,因为抽象类是一个特殊的Java类,Java类具有的属性和方法都可以定义在抽象类中,但是需要通过子类继承的方式获取。

评分

参与人数 1技术分 +1 收起 理由
潘才新 + 1 随机奖励

查看全部评分

回复 使用道具 举报
就如楼主所说:抽象类构造函数的存在就是为子类创建实例而准备的,他的意义也正是在此。请问楼主是不是在每个类中默认的构造函数中(除去上帝类(Object))都有一个隐式的super()语句呢?当然这是一定的。如果如楼主所想,把抽象类中的构造函数去掉的话,那么他的子类的super()语句找不到他父类构造函数那会怎么样呢?对他会报错。

评分

参与人数 1技术分 +1 收起 理由
潘才新 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马