在牛客网做Java面试题的时候发现有很多是关于类初始化时各个部分代码执行顺序的问题,于是编写了以下的代码来验证类内各部分代码的执行顺序。
class C {
C(){
System.out.print("父类成员变量 > ");
}
}
class D {
D(){
System.out.print("父类静态成员变量 > ");
}
}
class E {
E(){
System.out.print("子类成员变量 > ");
}
}
class F {
F(){
System.out.print("子类静态成员变量 > ");
}
}
class A {
C c = new C();
static D d = new D();
public A() {
System.out.print("父类构造函数 > ");
}
{
System.out.print("父类代码块 > ");
}
static {
System.out.print("父类静态代码块 > ");
}
}
public class B extends A {
E e = new E();
static F f = new F();
public B() {
System.out.print("子类构造函数 >");
}
{
System.out.print("子类代码块 > ");
}
static {
System.out.print("子类静态代码块 > ");
}
public static void main(String[] args) {
new B();
}
}
得到输出结果如下:
父类静态成员变量 > 父类静态代码块 > 子类静态成员变量 > 子类静态代码块 > 父类成员变量 > 父类代码块 > 父类构造函数 > 子类成员变量 > 子类代码块 > 子类构造函数
经检验分析得出以下规律:
静态变量先于静态代码块执行且父类先于子类执行。静态代码部分执行完成后,成员变量先于代码块先于构造函数执行且父类先于子类自行。