The order of object initialization in java

📅 23 Mar 2018 🕑 2 min read

Have you ever thought about in which order objects in java initialize? If you haven’t, this article can you help to find it out.

Given: two classes: Child and Parent. According to their names, one inherits from another one. Each class involves static and ordinal init blocks, static and non-static fields. Let’s look at this case more closely.

Parent.java

public class Parent {
    private static final String staticField = staticMethod();
    static {
        System.out.println("parent static block");
    }

    {
        System.out.println("parent non-static block");
    }
    private final String field = initMethod();
    private String initMethod() {
        System.out.println("parent non static field");
        return "";
    }

    public static String staticMethod() {
        System.out.println("parent static field");
        return "";
    }

    public Parent() {
        System.out.println("parent constructor");
    }
}

Child.java

public final class Child extends Parent {
     private final static String staticField = staticMethod();
     private final String field = initMethod();

     static {
            System.out.println("child static block");
     }

     {
            System.out.println("child non-static block");
     }


     public static String staticMethod() {
            System.out.println("child static field");
            return null;
     }

     private String initMethod() {
            System.out.println("child non static field");
            return null;
     }

     public Child() {
            System.out.println("child constructor");
     }
}

If we run compile and run this code by this way:

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

we will see the next output:

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

To sum up, we can see that objects inits in the particular order:

  1. all static blocks and fields of a parent class
  2. the same happens in a child class
  3. all non-static blocks and fields of a parent class
  4. invocation of a parent constructor
  5. initialization of non-static fields and blocks in a child class
  6. invocation of a child constructor

As we can see, the order is quite logical and easy to remember.

Related posts