黑马程序员技术交流社区

标题: 《哈尔滨校区》构造器中this 或者 super 为什么要放到第一... [打印本页]

作者: 283557811    时间: 2015-11-29 10:48
标题: 《哈尔滨校区》构造器中this 或者 super 为什么要放到第一...
本帖最后由 张研老师 于 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()必须放在第一行




作者: Xiiian    时间: 2015-11-29 11:06

作者: hugh88    时间: 2015-11-29 12:22
因为初始化,如果不放在第一行那么前面对属性的赋值都会被this或super语句从新赋值而覆盖掉之前的赋值
作者: Little_jie    时间: 2015-11-29 21:33
初始化的顺序要求,否则无法完成初始化
作者: 会走路的二百块    时间: 2015-11-29 22:13
总是忘了this不能用在static方法中
作者: 董钊    时间: 2015-11-29 23:48
好东西啊 兄弟 谢谢分享
作者: anuo    时间: 2015-11-30 09:15
先写先调用啊,而且在构造器中最多可以有N-1个使用this的
作者: TG·小强    时间: 2015-11-30 12:19
受教了,初始化必须放到第一行;this与super都用来初始化,都要第一行,所以矛盾,报错。
作者: bulala    时间: 2015-12-7 19:02
学习了





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