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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马潘浩 中级黑马   /  2013-3-7 16:41  /  1680 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么super()和this()调用语句只能作为构造函数的第一句出现?

点评

这个视频里面有的吧~~另外论坛也有  发表于 2013-3-14 09:57

5 个回复

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

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

回复 使用道具 举报
是这样的,我们都知道如果是继承对象的话,在它构造器初始化的话,都会先调用父类构造器,如果无特殊说明,默认调用父类无参数构造器,如果super()不是放在第一句的话,必然执行到这句时已经调用了父类无参数构造器,自然不能再次调用,再次初始化。this()调用语句只能作为构造函数的第一句出现的原因也同上,一般调用this(),是为了调用重载构造器,不放第一句的话,就等于已经默认初始化了,自然再次调用毫无意义。
  1. public class Test3 extends T
  2. {
  3.         public Test3()
  4.         {
  5.                 System.out.println("子类");
  6.         }
  7.         public static void main(String[] args)
  8.         {
  9.                 //输出结果是"父类无参数","子类",可以证明默认调用父类构造器为无参数的
  10.                 Test3 a = new Test3()
  11.         }
  12.        
  13. }
  14. class T
  15. {
  16.         public T()
  17.         {
  18.                 System.out.println("父类无参数");
  19.         }
  20.         public T( int a )
  21.         {
  22.                 System.out.println("父类有参数");
  23.         }
  24. }
复制代码
上面这段代码可以说明一点问题。希望我的回答可以帮助你。
回复 使用道具 举报
其实可以这么理解,在没放在第一行的时候我们为了满足一些我们的需求写完的一些语句,而在下面使用了super继承了父类的构造方法,那么以前所做的修改就都回到以前了,就是说又成了父类的构造方法了,那么就没有意义啦。另一方面子类是父类的拓展,而super则是这个子类的基础,在此基础上继续进行功能的拓展,更符合要求!
回复 使用道具 举报
如果第一句不是super,编译器默认添加一个,而这时你在后面再加一个,就多余了。
同样的this(代表另一个构造方法)中也有一个隐藏的super,如果this不再第一句,编译器会加一个super,而this中还有一个,也是多余。
回复 使用道具 举报
在Java中,构造一个对象的顺序是先构造父类对象,然后在构造完成的父类对象基础上构造子类对象。假设super不在第一句,那子类构造函数就在父类对象构造之前就已经开始构造,既然先决条件都没有满足,又怎么能就构造子类对象呢,如果硬要允许的话,可能会造成内部错误。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马