Initialization order of classes in Java

Keywords: Java

Initialization order of classes in Java

I. initialization order of test single class

public class ClassInitOrderTest {

  //Static variables
    public static String staticField = "static field";
  //Static code block
    static {
        System.out.println(staticField);
        System.out.println("static block");
    }
  //Member variables
    private String field = "member field";
  //Non static code block
    {
        System.out.println(field);
        System.out.println("non-static block");
    }
  //constructor
    public ClassInitOrderTest() {
        System.out.println("constructor");
    }

    public static void main(String[] args) {
        new ClassInitOrderTest();
    }

}

Program output:

static field
static block
member field
non-static block
constructor

Conclusion:

Static variable > static initial block > member variable > non static initial block > constructor

Class initialization order in test inheritance

class Parent {
  //Parent static variable
    private static String parentStaticField = "parent static field";
  //Parent static code block
    static {
        System.out.println(parentStaticField);
        System.out.println("parent static block");
    }
  //Member variables
    private String parentField = "parent member field";
  //Non static code block
    {
        System.out.println(parentField);
        System.out.println("parent non-static block");
    }
  //Parent constructor
    public Parent() {
        System.out.println("parent constructor");
    }

}

public class Child extends Parent {
  //Subclass static variable
    private static String childStaticField = "child static field";
  //Subclass static code block
    static {
        System.out.println(childStaticField);
        System.out.println("child static block");
    }
  //Subclass member variable
    private String childField = "child member field";
  //Subclass non static code block
    {
        System.out.println(childField);
        System.out.println("child non-static block");
    }
  //Subclass constructor
    public Child() {
        System.out.println("child constructor");
    }

    public static void main(String[] args) {
        new Child();
    }

}

Output results:

parent static field
parent static block
child static field
child static block
parent member field
parent non-static block
parent constructor
child member field
child non-static block
child constructor

Conclusion:

Parent static variable > parent static initial block > subclass static variable > subclass static initial block > parent member variable > parent non static initial block > parent constructor > subclass member variable > subclass non static initial block > subclass constructor

Posted by kane007 on Mon, 11 Nov 2019 11:47:03 -0800