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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

在继承中,子类调用父类的构造器时要用上super().(隐用和显用都可以)。为什么要用在第一行呢?
子类是从父类继承而来,继承了父类的属性和方法,如果在子类中先不完成父类的成员的初始化,则子类无法使用,应为在java中不允许调用没初始化的成员。在构造器中是顺序执行的,也就是说必须在第一行进行父类的初始化。而super能直接完成这个功能。This()通过调用本类中的其他构造器也能完成这个功能。
因此,this()或者super()必须放在第一行。

另外this().和super能不能同用于一个构造器内?

4 个回复

倒序浏览
不能,
this()的意思是调用本类中无参数的构造函数给自己这个构造函数初始化
而这个无参数的构造函数里面肯定有父类的构造函数初始化
所以使用了this()其实也就是使用了super
回复 使用道具 举报
是你如果想用传入当前构造器中的参数或者构造器中的数据调用其他构造器或者控制父类构造器时使用的,在一个构造器中你只能使用this()或者super()之中的一个,而且调用的位置只能在构造器的第一行,在子类中如果你希望调用父类的构造器来初始化父类的部分,那就用合适的参数来调用super(),如果你用没有参数的super()来调用父类的构造器(同时也没有使用this()来调用其他构造器),父类缺省的构造器会被调用,如果父类没有缺省的构造器,那编译器就会报一个错误。

为什么要在第一排呢?
example:
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(int c){
System.out.println("wrong,wrong");
}                  
                 B(String n) {            
                                      这里为空 // super();  
System.out.println("想想就是这样");         
                                         this();
//实际就是调用了B(){...},而B(){...}已经调用过一次,super();所以super()就被调用两次,也就是对A进行了两次初始化。而在实例化一个对象时,一 个 构造方法只能调用一次,这然显然是不对的.           
                  }  
不能再同一构造器中,会报错
回复 使用道具 举报
用new调用子类构造器来创建子类对象之前必须先在子类构造器中调用一个父类构造器来初始化父类,以保证子类能够使用父类继承下来的成员。

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

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

那么this也必须放在第一行,是因为有this的构造器不会再有任何的super,表面是不能直接调用父类构造器,但是this调用了子类中的其他构造器,这个被调用的子类构造器里有super来调用父类构造器,所以有this的构造器只是间接通过子类中的其他构造器来调用父类构造器,所以this放在第一行。
回复 使用道具 举报
this() super()
是你如果想用传入当前构造器中的参数或者构造器中的数据调用其他构造器或者控制父类构造器时使用的,在一个构造器中你只能使用this()或者super()之中的一个,而且调用的位置只能在构造器的第一行,在子类中如果你希望调用父类的构造器来初始化父类的部分,那就用合适的参数来调用super(),如果你用没有参数的super()来调用父类的构造器(同时也没有使用this()来调用其他构造器),父类缺省的构造器会被调用,如果父类没有缺省的构造器,那编译器就会报一个错误。



为什么要在第一排呢?

example:

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(int c){

System.out.println("wrong,wrong");

}                  

                 B(String n) {            

                                      这里为空 // super();  

System.out.println("想想就是这样");         

                                         this();

//实际就是调用了B(){...},而B(){...}已经调用过一次,super();所以super()就被调用两次,也就是对A进行了两次初始化。而在实例化一个对象时,一 个 构造方法只能调用一次,这然显然是不对的.           

                  }  


B(double c){

this();

this(3);

//这里实际上也是调用两次super(),也就是对A进行两次初始化,所以其结果也不对

}

}


注:任意一个类,它都一定有父类,如果你没有建立该类的父类,那么该类的父类为Object;


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马