JVM类的初始化顺序往往也是面试常见题目,因此我特地找了几个例子来帮助复习。
这是我当时字节面试的原题:
public class Parent {
{
System.out.println("父类非静态代码块");
}
static {
System.out.println("父类静态块");
}
public Parent() {
System.out.println("父类构造器");
}
}
public class Son extends Parent {
public Son() {
System.out.println("子类构造器");
}
static {
System.out.println("子类静态代码块");
}
{
System.out.println("子类非静态代码块");
}
}
public class Test {
public static void main(String[] args) {
Son son = new Son();
}
}
解决这个问题的核心:
- 父类的类构造器(static变量及代码块) -> 子类的类构造器(static变量及代码块) -> 父类的成员变量和实例代码块 -> 父类的构造函数 -> 子类的成员变量和实例代码块 -> 子类的构造函数
故答案应该是:
父类静态块
子类静态代码块
父类非静态代码块
父类构造器
子类非静态代码块
子类构造器
相关的解说以及对应例子: