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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张先庆 中级黑马   /  2013-7-22 21:37  /  1689 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

12 个回复

倒序浏览
当你创建一个子类的实例时,首先会调用父类的构造函数,然后再调用子类的构造函数,如果父类中没有缺省构造函数,则必须再子类的构造函数中显示的调用它(如下面的例子),
在程序中的顺序是这样的:
         
                 super(...) //父类构造函数
                  .....        //当前类构造函数语句
同样的道理,当一个类中有多个构造函数的时候,在其中一个构造函数中也可以先调用其他的构造函数来初始化对象,这种方法叫做“显式构造方法调用”,当那样的构造方法被调用,它将执行通常的super() 过程以及后续的操作。然后在执行本构造函数中的构造语句,这个时候的顺序是这样的:
                  this(....)     //当前类的其他构造函数
                  ...         //当前构造函数的其他语句

其实为什么要把this(...)放在前面很容易理解,因为任何的子类都必须要先调用父类的构造函数,而当你采用“显示构造方法调用”即用this(...)调用当前类的其他构造函数时,这个时候父类的构造就在this(...)里面执行了,this(...)里面应该不仅包括当前类的构造,还必须包括父类的构造,所以为了保证父类的构造函数先被执行,必须要先调用this(.....)

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
本帖最后由 薛鹏鹏 于 2013-7-22 22:15 编辑

第一个问题你自己已经回答了,就是因为super()和this()调用语句只能作为构造函数的第一句出现,它们不可能同时出现在第一行,所以不能同时在一个构造函数中出现。

第二个问题:                1.这是java的规定;
                2.假设可以不放在第一行,比如放在第5行,那么你前面4行对对象进行初始化动作,当进行到第5行来了个super(),这时候对象会被super()初始化为空,前面的4行代码的初始化动作就白费了。


回复 使用道具 举报
this:代表是一个对象,代表那个对象呢?
哪个对象调用this所在的函数,this就代表那个对象,this就是当前对象的一个引用。
this:表现形式一:当局部标量和成员 变量同名的时候,可以用this来区分。
      表现形式二:构造函数之间的调用可以使用this关键字,后面跟上小括号,指定具体ude实参即可明确要调用的构造函数。
  特殊情况:注意:调用本类中构造函数的this语句必须要定义在构造函数的第一行。因为初始化动作先完成。

this和super调用构造函数只能定义构造函数的第一行,不能同事出现,为什么都定义在第一行啊?因为初始化的动作要先执行。

super代表的是父类。
用法和this相似,this代表本类对象的引用,super代表父类所属的空间。
注意:子父类中通常不会出现同名的属性。
      父类中既然定义了该属性,子类其实就没有必要在定义该属性了。】
上面说的是区别  还有就是子类实例化的过程 this和super  这个 在继承中就可以体现了
一个对象在内存中的产生过程:
1,将该对象所需的类文件加载进内存,
2,在内存进行空间的方法区的空间分配。
3,通过new在堆内存中开辟空间,
4,对象中的属性进行默认初始化。
5,调用与之对象的构造函数进行初始化。
6,通过构造函数的super调用父类中的构造函数初始化。
7,对象中的属性进行显示初始化。
8,构造代码块初始化。
9,该构造函数内部自定义内容进行初始化。

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
先来回答第二个问题。因为子类会获取到父类中的数据,必须要先明确父类对数据的初始化过程。要想生成子类的对象,首先需要生成父类的对象,没有父类对象,就没有子类对象。我们可以认为必须先有了父亲,才能后有孩子,所以super()要放在第一句。this()是对本对象的初始化,有了本对象的初始化后,才能进行其他操作,这跟super()是一个道理。当父类中没有空参数构造函数时,子类构造函数必须通过super句来明确要访问的父类中指定的构造函数。当然子类构造函数也可以通过this语句访问本类中的构造函数。但是子类中肯定,至少有一个构造函数会访问父类。 第一个问题可以用第二个问题这个已知来回答,我们已经知道了super()和this()调用语句只能作为构造函数的第一句出现,那么当这两条语句同时在一个构造函数中出现时,必定有一个不是作为第一句出现,与我们的已知矛盾。

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
1,类一定有构造器。2,构造函数的作用:可以用于给对象进行初始化。
3,继承中的构造器
        子类构造器一定调用父类构造器
        子类构造器中默认调用父类无参构造器
        super()表示调用父类构造器
        使用super()来调用父类构造器必须写在子类构造器的[第一行]!
        this()也必须写在构造方法的第一行
        有super()就不能用this(),两者互斥
       
        若子类没有显示的在构造方法中调用父类的构造方法,而父类又没
        有无参的构造方法,那么会出现编译错误


评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
其实最终都有调用到super,因为你调用this()时,这个构造函数中也会有一条super()的,总不能调用两次吧.
至于为什么只能在第一行是因为,因为这两都只是进行初步的初始化,若你后面还有赋值语句的,就会用你后面赋的值,
而不是这个最初赋的不是想要的值.

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
类中的对象肯定都要指定调用方法super表示引用的是父类的。this表示引用当前类的。这是肯定不能共存的。
为什么放在第一行的话,原理类似与你定义一个类 肯定会先标出其含有的元素啊。

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
因为this()和super()都只能在构造函数的第一个位置出现,而且系统只能调用其中之一,这个是系统实例化过程的一个规则

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
super(参数):调用父类的构造方法 。
this(参数):调用本类的其他构造方法。
都必须放在构造方法的第一行。   
super:引用父类中的成员,当子类和父类中的方法重名时,这样用。
this:代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)。  
this()和super()都指的是对象,所以,均不能在static环境中使用。包括:static变量,static方法,static语句块。  
从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
子类的构造函数都隐式的调用了父类的构造函数。用了this(),相当于通过this()去调用super(),所以不能再用super()。还有就是this()和super()只能作为第一句出现,所以只能二选一。只能作为构造函数出现的原因是:构造函数是初始化对象用的,调用this()和super()都是为了看看其他构造函数是怎么初始化的,我理解为先看后改;否则就是先改后看,就不安全了。
回复 使用道具 举报
super()表示父类调用;this表示本类调用;
首先说一下这两者的共同点,即两者都要放在构造函数的第一行,这也就回答了为什么不能同时出现的情况。第一行只有一个,只能给this()活着super()其中之一。
回答你的第二个问题,为什么只能出现在第一行。这是因为两者都是对对象的默认初始化。即this()调用本类默认的那个无参构造函数,super()调用父类默认构造函数。如果后面还有别的初始化语句,则被覆盖,对象被最终初始化。所以如果this()或者super()在后面几行的话,你自己对对象的初始化则被覆盖,即无论你怎么初始化,对象都只不会初始化成你要的结果。
回复 使用道具 举报
如果this出现在一个构造方法中要求this必须放在第一行,super也一样。
如果它们两个同时出现在同一个构造方法中,那不是要有两句话都要放在第一行了,怎么放?所以不能同时出现在同一个构造方法中。

1、super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句)

2、this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马