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

© 龚建锋 初级黑马   /  2012-7-8 13:58  /  1609 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么super()和this()调用语句不能同时在一个构造函数中出现呢

6 个回复

倒序浏览
本帖最后由 邵阳 于 2012-7-8 14:13 编辑

super() 和 this() 都要求在构造函数中的第一句位置调用,所以不可能在同一构造中同时调用super()和this()。
super()和this()分别是显示的调用了父类和子类的无参构造函数,如此JVM就不会自动调用默认的构造函数。
其实在不显示调用super()和this(),JVM还是会调用。
因此,如果你在构造函数显示的调用构造super()或者this(),必须是要放在第一个语句上

详见http://bbs.itheima.com/thread-18678-1-2.html
回复 使用道具 举报
本帖最后由 梁健生 于 2012-7-8 15:12 编辑

先给你解释一下,构造函数间的引用,this()只能在第一行,而子类引用父类也只能在第一行super(),
所以他们两个不可能在同一个构造函数中存在!!

如果想了解更清楚,请重新观看视频day7和day6!!
回复 使用道具 举报
笔记:
      子类中至少有一个构造函数访问父类
注意:super()函数写在子类构造函数的第一行
      this()函数写在构造函数的第一行
在对子类对象进行初始化时父类的构造函数也会运行,那是因为子类的构造函数

默认第一行有一条隐式的语名super();
super():会访问父类中空参数的构造函数。而且子类中所有的构造函数默认第一

行都是super();

为什么子类一定要访问父类的构造函数。
因为父类中的数据,子类可以直接获取。所以子类对象在建立时,需要先查看父

类是如何对这些数据进行初始化的。
所以子类在对象初始化时,要先访问一下父类中的构造函数。
如果要访问父类中指定的构造函数,可以通过手动定义super语名的方式来指定。

子类 实例化过程
结论:
子类的所有的构造函数,默认都会访问父类中空参数的构造函数。因为子类每一

个构造函数内的第一行都才一句隐式super()
当父类中没有空参数的构造函数时,子类必须手动通过super语句形式来指定要访

问父类中的构造函数。
当然:子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数


子类中至少有一个构造函数会访问父类中的构造函数。
注意:super语句一定定义在子类构造函数的第一行。

两个都要求在第一行,所以不能同时出现
回复 使用道具 举报
梁健生 发表于 2012-7-8 14:10
.........有点无语!!!先给你解释一下,构造函数间的引用,this()只能在第一行,而子类引用父类也只能 ...

哥们,建议你不要这么说,谁都有迷惑的时候,我觉得任何人刚开始学的时候都不可能一下子就全明白了,所以不要打击别人的积极性,我这人是直肠子,有什么说什么,不要见怪哈,对于新手,我们要多加鼓励才是,再者说任何一个高手也不可能全都明白,希望你不要误会,,我不是针对你,我只不过是觉得你那个" 有点无语"在这里用的有点不妥,你觉得呢,呵呵!!!
回复 使用道具 举报
田向向 发表于 2012-7-8 14:57
哥们,建议你不要这么说,谁都有迷惑的时候,我觉得任何人刚开始学的时候都不可能一下子就全明白了,所以 ...

我先收回那句话,可能是我用词不妥吧,我的意思是 ,很难想象如果一直仔细看视频的话,会问出这个问题!!  对此要是对楼主照成一些不好的事情,我非常抱歉!!请原谅!!!
回复 使用道具 举报
本帖最后由 曹恒业 于 2012-7-8 15:19 编辑

关于this和super的问题还真是多,这个问题昨天已经详细回答过。请参考下面的链接。
http://bbs.itheima.com/thread-18678-1-2.html
建议楼主发帖前先使用论坛里搜索功能。
希望斑竹多提醒大家。要不重复的问题越来越多。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马