黑马程序员技术交流社区

标题: 关于抽象类的构造函数 [打印本页]

作者: straw    时间: 2013-9-9 00:32
标题: 关于抽象类的构造函数
本帖最后由 潘才新 于 2013-9-12 23:18 编辑

抽象类不能被实例,因为抽象类是描述现实中的抽象事物.那为什么抽象类中还要存在构造函数?而且还可以定义有参构造函数,在子类中用super(...)来调用对应的构造函数.在子类被实例的时候抽象父类的无参构造函数也会被调用,难道保留抽象类的构造函数是为了初始化代码块?但是在子类的构造函数中完全可以实现这个功能.那为什么还要在抽象类中保留构造函数呢?如果去除了抽象类的构造函数,那么子类在实例的时候就不再调用该方法(减轻资源损耗),子类的成员super中也不在包含构造成员,从而可以达到程序的精简作用.
作者: 吕振中    时间: 2013-9-9 08:21
1.首先你要搞清楚java里new这个关键字,new说的是要调用构造方法,分配内存空间,创建实例,抽象类是不允许new的,但是抽象类可以有构造方法,我们知道通常创建类的实例需要new 类();这种形式,但是只能说new调用构造方法才是创建对象,而抽象类不可以有实例,但是可以调用构造方法,因为它不是new调用,而是通过new子类,根据依赖关系,自动调用的
作者: 黄文伯    时间: 2013-9-9 14:13
亲,如问题已解决请将分类的“未解决”改为“已解决”。
以后的问题贴也要及时更改分类哦~
作者: 吃阁子的猫    时间: 2013-9-9 15:18
楼主绕口令的话比我看代码还晕,只看了第一句,抽象类只有被继承才有意义,子类会自动调用父类的空参构造方法,所以抽象类是一定有构造函数的
作者: straw    时间: 2013-9-9 19:09
吃阁子的猫 发表于 2013-9-9 15:18
楼主绕口令的话比我看代码还晕,只看了第一句,抽象类只有被继承才有意义,子类会自动调用父类的空参构造方法, ...

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

我是想把我的思路从头到脚都说出来,然后在提出问题,没想到让人看起来更是费解!以后尽量简洁!

作者: straw    时间: 2013-9-9 19:16
吕振中 发表于 2013-9-9 08:21
1.首先你要搞清楚java里new这个关键字,new说的是要调用构造方法,分配内存空间,创建实例,抽象类是不允许 ...

创建子类对象的时候回去调用父类的空参构造函数,可是这个构造函数体中既没有代码块,也没有去创建实例.等于调用这个函数却什么事都不干!
但抽象类中却始终都保留构造函数,难道抽象类的构造函数还有其他意义?

作者: 吃阁子的猫    时间: 2013-9-9 19:32
straw 发表于 2013-9-9 19:09
呵呵  我是想问抽象类为什么不去除构造函数?保留构造函数在抽象类中还有什么其他意义?   

我是想把我的 ...

不是这个意思,呵呵,是我今天脑袋有点晕,当然是讲的越清楚越好

作者: 吃阁子的猫    时间: 2013-9-9 19:36
straw 发表于 2013-9-9 19:16
创建子类对象的时候回去调用父类的空参构造函数,可是这个构造函数体中既没有代码块,也没有去创建实例.等 ...

子类既然继承了父类,就会先看父类是如何初始化的,根据父类的一些成员.方法啊,在确定自己是否要做一些特有的操作,所以调用父类的构造方法是必要的
作者: 多多    时间: 2013-9-9 22:01
抽象类也是类,类中就要有构造方法吧,我这么认为.不知道理解对不对
作者: 杨彬    时间: 2013-9-10 22:02
抽象类有构造用来给子类对象初始化用,因为抽象类是一个特殊的Java类,Java类具有的属性和方法都可以定义在抽象类中,但是需要通过子类继承的方式获取。
作者: 王广亚    时间: 2013-9-10 22:08
就如楼主所说:抽象类构造函数的存在就是为子类创建实例而准备的,他的意义也正是在此。请问楼主是不是在每个类中默认的构造函数中(除去上帝类(Object))都有一个隐式的super()语句呢?当然这是一定的。如果如楼主所想,把抽象类中的构造函数去掉的话,那么他的子类的super()语句找不到他父类构造函数那会怎么样呢?对他会报错。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2