代码
public class Demo {
class Super{
int flag=1;
Super(){
test();
}
void test(){
System.out.println("Super.test() flag="+flag);
}
}
class Sub extends Super{
Sub(int i){
flag=i; //flag=5
System.out.println("Sub.Sub()flag="+flag);
}
void test(){
System.out.println("Sub.test()flag="+flag);
}
public static void main(String[] args){
new Demo().new Sub(5);
}
}
}
运行结果
Sub.test() flag=1 Sub.Sub() flag=5
运行图示
总结
1.如果父类中定义了无参构造函数,或者任何构造函数都没有定义,子类在调用其构造函数之前会先隐式地调用父类的无参构造函数
2.如果父类中没有定义无参构造函数,但是定义了其他有参构造函数,子类在其构造函数的第一行必须显式地调用父类的有参构造函数,super(param)
3.子类在调用其构造函数之前必须先调用父类构造函数(不管隐式还是显式)原因是:子类继承了父类的属性和方法,这些属性在使用之前必须先初始化,而有些私有属性可能是在构造器中进行初始化的,因此必须先调用父类的构造函数进行初始化