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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

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

6 个回复

倒序浏览
子类是从父类继承而来,继承了父类的属性和方法,如果在子类中先不完成父类的成员的初始化,则子类无法使用,因为在java中不允许调用没初始化的成员。在构造器中是顺序执行的,也就是说必须在第一行进行父类的初始化。而super能直接完成这个功能。This()通过调用本类中的其他构造器也能完成这个功能。
因此,this()或者super()必须放在第一行。
回复 使用道具 举报
this:this需要定义在函数中,是本类对象的引用。
                那么它到底引用哪个对象呢?
                哪个对象调用了this所在的函数,this就引用哪个对象。
this的应用:
        1,当定义功能时,功能内部需要用到本类对象时,就用this表示。
        2,当成员变量和局部变量同名的时候,用this来区分。
        3,当构造函数之间进行调用的时候,可以使用this语句。

构造函数在对象建立时就被直接调用:
作用:用于给对象进行初始化。

构造函数和一般函数区别之一。

一般函数是用于定义对象应该具备的功能。
而构造函数定义的是,对象在调用功能之前,在建立时,应该具备的一些内容。也就是对象的初始化内容。

区别之二:
构造函数是在对象建立时被调用。给对象初始化。
一般函数是对象建立后,当对象调用该功能时才会执行。
构造函数细节:
        当类中没有定义构造函数时,系统会指定给该类加上一个空参数的构造函数。这个是类中默认的构造函数。
        当类中如果自定义了构造函数,这时默认的构造函数就没有了。

在一个类中可以定义多个构造函数,以进行不同的初始化。
多个构造函数存在于类中,是以重载的形式体现的。因为构造函数的名称都相同。


至于二者为什么都放在第一行:是因为二者都是调用构造函数,因为构造函数适用于初始化的,所以初始化的动作必须首先完成
回复 使用道具 举报
子类的构造函数在进行对象初始化时都会默认访问父类中的空参数构造函数。
        是通过子类构造函数第一行的一条隐式语句完成的
为什么子类对象在初始化是一定要访问父类中的构造函数呢?
因为子类继承了父类后,存储了父类中的属性,必须要先看父类是如何对自己的属性进行初始化的、如果父类中没有提供空参数构造函数,子类的构造函数中必须通过super语句明确调用父类中的指定构造函数。
子类构造函数中也可以通过this语句调用本类的构造函数,本类中的其他构造函数肯定会访问父类的构造函数,对子类对象进行初始化。

super语句不可以和this语句共存,因为这些语句一定要定义在构造函数的第一行。
为什么要定义在第一行呢?因为初始化的动作要先完成,尤其是父类的初始化。

上面这些实际上也是子类的实例化过程

评分

参与人数 1技术分 +1 收起 理由
创出一片辉煌 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
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()必须放在第一行。

回复 使用道具 举报
用new调用子类构造器来创建子类对象之前,必须先在子类构造器中用super调用一个父类构造器,来初始化父类,以保证子类能够使用父类继承下来的成员。

子类构造器是用super隐式或显示来调用父类构造器的。隐式是指在子类构造器中没有手动编写使用super和this时,系统自动在子类构造器中第一行语句之前隐式默认加上super()来调用父类无参构造器,此时如果父类没有super()所对应无参构造器,则会出错。反之显示使用super或this时,系统不会在此子类构造器中再提供隐式的super(),即会用显示使用的super或this来代替隐式的super()。

因为隐式的super()默认是在第一行语句之前,所以显示使用的super需要放在第一行才可以覆盖隐式的super()。

那么this也必须放在第一行,是因为有this的构造器不会再有任何的super,表面是不能直接调用父类构造器,但是this调用了子类中的其他构造器,这个被调用的子类构造器里有super来调用父类构造器,所以有this的构造器只是间接通过子类中的其他构造器来调用父类构造器,所以this放在第一行。
回复 使用道具 举报
因为初始化的 要先执行
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马