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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 张研老师 于 2015-11-29 23:22 编辑

构造器中this 或者 super 为什么要放到第一行?
this() super()是你如果想用传入当前构造器中的参数或者构造器中的数据调用其他构造器或者控制父类构造器时使用的,在一个构造器中你只能使用this()或者super()之中的一个,而且调用的位置只能在构造器的第一行,在子类中如果你希望调用父类的构造器来初始化父类的部分,那就用合适的参数来调用super(),如果你用没有参数的super()来调用父类的构造器(同时也没有使用this()来调用其他构造器),父类缺省的构造器会被调用,如果父类没有缺省的构造器,那编译器就会报一个错误。
假如我们允许把this super放置到任何位置。那么请看下面代码:
class A{     A()   {        
System.out.println("You call super class non-args constructor!");
  }}
class B extends A{     
B()      {              //这里,编译器将自动加上 super();            
  System.out.println("You call subclass constructor!");     
}                  
  B(String n)       {            
  super();            
  this();//实际就是调用了B(){...},而在B(){...}中编译器自动加上了                       //super();这样就相当于两次调用了super();也就是说对父类进//行了两次初始化。而在实例化一个对象时,一个构造方法只能调用一次,这说明this和super不能同时存在一个构造方法中。同时因为系统没有在第一行发现this()或super()调用,就会自动加上super(),如果没有将this()和super()放在第一行就会产生矛盾。                    //因为总有一个super()在第二句上。所以该程序不能通过编译!!!        
}
也就是说你必须在构造器的第一行放置super或者this构造器,否则编译器会自动地放一个空参数的super构造器的,其他的构造器也可以调用super或者this,调用成一个递归构造链,最后的结果是父类的构造器(可能有多级父类构造器)始终在子类的构造器之前执行,递归的调用父类构造器。无法执行当前的类的构造器。也就不能实例化任何对象,这个类就成为一个无为类。
从另外一面说,子类是从父类继承而来,继承了父类的属性和方法,如果在子类中先不完成父类的成员的初始化,则子类无法使用,应为在java中不允许调用没初始化的成员。在构造器中是顺序执行的,也就是说必须在第一行进行父类的初始化。而super能直接完成这个功能。This()通过调用本类中的其他构造器也能完成这个功能。
因此,this()或者super()必须放在第一行



评分

参与人数 2技术分 +5 黑马币 +5 收起 理由
张研老师 + 4 + 5 赞一个!
洋葱头头 + 1

查看全部评分

8 个回复

倒序浏览
回复 使用道具 举报
hugh88 来自手机 中级黑马 2015-11-29 12:22:18
藤椅

回帖奖励 +1

因为初始化,如果不放在第一行那么前面对属性的赋值都会被this或super语句从新赋值而覆盖掉之前的赋值
回复 使用道具 举报
初始化的顺序要求,否则无法完成初始化
回复 使用道具 举报
总是忘了this不能用在static方法中
回复 使用道具 举报
好东西啊 兄弟 谢谢分享
回复 使用道具 举报
anuo 中级黑马 2015-11-30 09:15:59
7#
先写先调用啊,而且在构造器中最多可以有N-1个使用this的
回复 使用道具 举报
受教了,初始化必须放到第一行;this与super都用来初始化,都要第一行,所以矛盾,报错。
回复 使用道具 举报
bulala 中级黑马 2015-12-7 19:02:41
9#
学习了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马