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变量及代码块) -> 父类的成员变量和实例代码块 -> 父类的构造函数 -> 子类的成员变量和实例代码块 -> 子类的构造函数
故答案应该是:
父类静态块
子类静态代码块
父类非静态代码块
父类构造器
子类非静态代码块
子类构造器
相关的解说以及对应例子:
本文通过具体示例解析了JVM中类的初始化顺序,包括父类与子类的静态与非静态代码块及构造器的执行顺序,并提供了解决方案。
300

被折叠的 条评论
为什么被折叠?



