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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 霍永刚 中级黑马   /  2012-9-18 20:58  /  2387 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

也多少知道,但是说不明白,希望大侠能给总结一下,谢谢……

2 个回复

倒序浏览
注意并不是在任何地方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();也就是说对父类进行了两次初始化。而在实例化一个对象时,一个构造方法只能调用一次,这说明this和super不能同时存在一个构造方法中。同时因为系统没有在第一行发现this()或super()调用,就会自动加上super(),如果没有将this()和super()放在第一行就会产生矛盾。 因为总有一个super()在第二句上。所以该程序不能通过编译。      

  }

也就是说你必须在构造器的第一行放置super或者this构造器,否则编译器会自动地放一个空参数的super构造器的,其他的构造器也可以调用super或者this,调用成一个递归构造链,最后的结果是父类的构造器(可能有多级父类构造器)始终在子类的构造器之前执行,递归的调用父类构造器。无法执行当前的类的构造器。也就不能实例化任何对象,这个类就成为一个无为类。
  
从另外一面说,子类是从父类继承而来,继承了父类的属性和方法,如果在子类中先不完成父类的成员的初始化,则子类无法使用,应为在java中不允许调用没初始化的成员。在构造器中是顺序执行的,也就是说必须在第一行进行父类的初始化。而super能直接完成这个功能。This()通过调用本类中的其他构造器也能完成这个功能。
因此,this()或者super()必须放在第一行。

回复 使用道具 举报
      因为父类中的成员子类可以直接获取,子类对象在建立时,需要先查看父类是如何对这些成员进行初始化的。子类在对象初始化时,要先访问一下父类中的构造函数。所以要先用super()来调用父类的构造函数而且要放在第一行。
      如果要访问父类中指定的构造函数,可以通过手动定义super语句的方式来指定。子类的所有的构造函数,默认都会访问父类中缺省的构造函数。因为子类每一个构造函数内的第一行都有一句隐式super();当父类中没有缺省的构造函数时,子类必须手动通过super语句形式来指定要访问父类中的构造函数。
      同理:子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马