黑马程序员技术交流社区

标题: 关于构造函数中的this和super,没弄明白 [打印本页]

作者: 王新新    时间: 2013-5-23 21:51
标题: 关于构造函数中的this和super,没弄明白
本帖最后由 王新新 于 2013-5-23 22:58 编辑

为什么super()和this()调用语句不能同时在一个构造函数中出现?
为什么super()和this()调用语句只能作为构造函数的第一句出现?
一直没怎么理解明白
作者: 棉/mg花/x糖    时间: 2013-5-23 21:58
楼主,你好,请看我这个帖子的总结,你就知道为什么了!
http://bbs.itheima.com/thread-51403-1-1.html
作者: 悟佛修道    时间: 2013-5-23 22:00
第一,因为他们两个都必须在构造函数的第一句。
第二,假设他们在后面几句但是初始化内容为空,而在他们前面还有些你自定义的初始化语句。那么这时你定义好对象后本身目的是想对象被你自定义的内容初始化对吧,但是按照构造函数的每一句执行下去,前面你自定义的内容确实已经给对象初始化成功了,可到了某一句突然来了个super(),那么请问这时对象会发生什么?当然是会被super()初始化为空,那你前面初始化的值岂不是白费了。所以,我们要让空先去初始化,然后在初始化自己定义好的内容。这样自己初始化的内容才不会被覆盖掉。
作者: 袁梦希    时间: 2013-5-23 22:05
这样的问题在黑马论坛可以搜到,没有必要发出来,楼主要对自己的学习负责。
作者: eycrckag    时间: 2013-5-23 22:07
super是父类的引用,this是本类引用,因为是两个引用,所以是两个指向,不可能在一个构造函数中出现。如果出现了,jvm应该怎样执行呢?试想下!suoer语句和this语句。先执行。是对对象进行初始化的。也不可能同时出现。两个指向一个父类,一个子类。虚拟机如何执行呢
作者: 风乐    时间: 2013-5-23 22:08
其实这两个都是等于借用别人的东西,你先借过来然后对哪里有自己独有的需求再复写进行修改。而如果你先自己定了自己的需求然后又拿别人的来用了,那你当初自己定义那些还有什么用呢;
super():继承父类,就是在父类这个基础模板上进行修改和加强,所以使用子类是要先对模板初始化,然后再加载模板上的修改项,所以构造时需要super()先调用父类构造函数进行初始化。
this():这个是调用本类中其他构造函数来提高代码复用性,同理是用别的构造函数为模板了,要先把别的那个初始化然后再加载自己的特有信息
作者: 米大米    时间: 2014-4-16 10:26
对于变量:
如果子类中出现非私有的成员变量时
子类要访问本类中的变量用this,要访问父类的变量用super
this代表的是本类对象的引用
super代表的是父类对象的引用

对于子父类中的构造函数:
在对子类对象进行初始化时,父类的构造函数也会运行
那是子类的构造函数默认第一行有一条隐式的语句super();
super()会访问父类中空参数的构造函数,而且子类中所以构造函数默认第一行都是super();

为什么子类一定要访问父类中的构造函数?
因为父类中的数据子类可以直接获取,所以子类建立对象时,需要先查看父类是如何对这些数据进行初始化的
所以子类在对象初始化时要先访问一下父类中的构造函数
如果要访问父类中指定的构造函数,可以通过手动定义super语句来指定

注意:super语句一定定义在子类构造函数的第一行

子类的实例化过程:
子类的所有构造函数,默认都会访问父类中空参数的构造函数
因为子类每一个构造函数内的第一行都有一句隐式的super()

当父类中没有空参数的构造函数时,子类必须通过super或this语句来指定要访问的构造函数
当然子类构造函数的第一行也可以手动指定this语句来访问本类中的构造函数
子类中至少有一个构造函数会访问父类中的构造函数
作者: 张志成    时间: 2014-4-18 01:43
不能说super是父类对象的引用,记住!!!!对象是通过new 关键字来创建的,那为什么子类可以通过super.的方式来访问父类中的成员呢?  因为在要子类的class文件被加载到方法区之前,jvm就将父类的class文件加载到方法区中,随后当子类对象创建完成时,自己在堆中的空间中保留了父类的属性,记住!!!但它不是子类的属性,super就像把钥匙,子类可通过它访问堆中的保留的父类属性,也可以通过super访问方法区所属父类class文件中的方法




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