class A{
public A(){
System.out.println("class A");//父类构造方法
}
{
System.out.println("I am A class ");//父类构造块
}
static {
System.out.println("class A static");//父类静态块
}
}
public class B extends A{
public B(){
System.out.println("class B");//子类构造方法
}
{
System.out.println("i am B class");//子类代码块
}
static {
System.out.println("class B static");//子类静态块
}
public static void main(String[] args) {
new B();
}
}
以上代码的运行结果如下:
原因:
当运行一个子类程序时,JVM首先会先完成加载:
先父类再子类,所以会先执行父类和子类的静态代码域。
加载完成后,开始编译执行(走main方法入口):
main方法的代码是要new一个子类,所以首先会去初始化父类再去构造子类。而初始化父类的操作是,先是非静态代码块/变量,最后是构造函数。完成了父类的创建后,按照相同的规则去构造子类。
我感觉优先级顺序为:静态代码块>非静态代码块>构造方法。