看不懂就可以去自己调试:
程序刚刚开启的时候
就加载父类和子类的静态代码块
例如:
static{
………
}
先加载父类的,再加载子类的
进入语句
父类 a = new 子类();
首先到子类的构造函数,不进去,再去寻找父类的构造函数,一样不进去。
找到父类里面的可能会new的地方,进去new出来。
new完之后,去找父类中不比静态代码块优先级低一点点的普通代码块
没有代码块之后,就去父类的构造方法
没有构造方法之后就回到子类
先执行子类的普通代码块,因为静态代码块早就执行完了
再去找子类需要new的代码
new的顺序也跟父子类一样
new完之后就去找子类的构造方法
父类 a = new 子类();就已经结束了
进入
a.调用方法();
先进子类,子类如果有重写该方法,就执行,否则就去父类找
总结:
父类的静态代码块->子类的静态代码块
(自上而下指的是谁在上面就先执行谁)
->初始化父类的属性值/父类的普通代码块(自上而下的顺序排列)->父类的构造方法
->初始化子类的属性值/子类的普通代码块(自上而下的顺序排列)->子类的构造方法。