子类继承父类后构造器的特点:
子类中所有的构造器默认都会先访问父类中无参的构造器,再执行自己。
为什么?
- 子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据。
- 子类初始化之前,一定要调用父类构造器先完成父类数据空间的初始化。
package com.exts.consts;
public class Main {
public static void main(String[] args) {
SO so = new SO();
System.out.println("---------");
SO sp = new SO();
}
}
package com.exts.consts;
public class Fa {
public Fa() {
System.out.println("父级无参构造器");
}
public Fa(int a){
System.out.println("父级有参构造器");
}
}
package com.exts.consts;
public class SO extends Fa{
public SO() {
System.out.println("子类无参构造器");
}
public SO(int a) {
super(a);
System.out.println("子类有参构造器");
}
}
Main方法运行结果:
父级无参构造器
子类无参构造器
---------
父级无参构造器
子类无参构造器
super调用父类有参数构造器的作用:
初始化继承自父类的数据。
您可能已经发现在上面我们演示子类调用父级有参构造器时用到了super()函数来传递参数,这在我们的实际开发中也是经常会遇到的方法,在子类的有参数构造器当中通过super()作为桥梁向父类的有参构造器传递参数就可以直接向父类传递参数。
而子类优先加载父类构造器的特性可以使得在调用自己的构造器之前就完成参数的传递,可以起到类似初始化的效果。
我们可以通过下面的代码演示来增加了解:
Main(){
Son S = new Son(1,1);
}
Son extends Father{
public Son(int a, int b){
super(a,b);
}
}
Father{
int value1;
int value2;
public Father(int f, int g){
this.value1 = f;
this.value2 = g;
}
}
如果父类中没有无参数构造器,只有有参构造器,会出现什么现象呢?
●会报错。因为子类默认是调用父类无参构造器的。
如何解决?
●子类构造器中可以通过书写supr(..).手动调用父类的有参数构造器,或者写出来
基于上面的问题所以我们建议写构造器时最好无参构造器和有参构造器(如果有)都写出来会比较好。