构造器
1.父类中如果有无参构造器,在子类中的每个构造器首行都会有一个默认的隐式的super()指向父类的无参构造器。
2.如果父类中没有无参构造器,子类中的每个子类构造器的首行要显示调用父类的有参构造器,或者this调用本类构造器。
注意
在第二点这里,如果父类中没有无参构造器,在子类无参构造器中如果直接调用父类有参构造,会报错“cannot reference ‘xxx’ before supertype construct has been called”,下面是错误代码:
父类:
public class Test2 {
private int age;
private String name;
private Test2(){}//父类这里构造器声明为私有,子类是无法通过super()访问到的
public Test2(int age,String name){
this.age=age;
this.name=name;
}
}
子类:
public class Test2Extends extends Test2{
int age;
String name;
public Test2Extends(){
super(age,name);//cannot reference 'xxx' before supertype construct has been called
}
}
通过以上代码发现会报错,其实分析一下就知道,如果我们想要使用子类,肯定是先调用子类构造器创建对象,如果正好使用的是子类的无参构造器,那么一定会执行子类中的super(age,name),但重点就是,类的加载顺序,是先初始化构造器然后再初始化非静态变量,此时age name非静态变量还没有被加载,那么编译器一定会迷惑他俩是哪来的。
解决
所有静态的成员都是随着类被加载而加载,想要构造器中的两个变量提前被加载,把它声明成静态的就行呗
public class Test2Extends extends Test2{
static int age;
static String name;
public Test2Extends(){
super(age,name);
}
}