代码执行顺序应该为:
父类初始化块→子类初始化块
→父类实例初始化块→父类构造器
→子类实例初始化块→子类构造器
则下述代码执行顺序为
a行代码执行前,依次触发父子类初始化块(没有具体代码,则省略细节)
而后,a代码开始执行,触发Base类的实例初始化,即b代码块执行,输出base;
而后父类构造器开始允许,即c代码块开始运行,调用子类中method方法,输出sub 100;
而后 开始进行子类实例初始化块,即d代码块开始运行,输出sub;
最后子类构造器开始运行,e行代码开始执行,调用父类的metho方法。输出base 70;
易错点:
在子类构造器中有两行代码 super();//f
super.method(70);//e
可能会以为在父类构造器运行后(即f行代码),转而就运行e行代码。 错错错!
真实情况是e行代码会在子类实例初始化块结束后才会运行!!!!
public class Test{
public static void main(String[] args) {
Sub s = new Sub();//a
}
}
class Base{
Base(){//c
this.method(100);
}
{//b
System.out.println("base");
}
public void method(int i){
System.out.println("base : " + i);
}
}
class Sub extends Base{
Sub(){
super();//f
super.method(70);//e
}
{//d
System.out.println("sub");
}
public void method(int j){//3
System.out.println("sub : " + j);
}
}