Вы никогда не задумывались, как происходит инициализация объекта класса, который в свою очередь наследуется от другого класса?

Порядок довольно прост. Допустим у нас есть класс Parent и класс Child. Child является потомком Parent.
В обоих классах есть и статические и простые блоки инициализации, так присутствуют и поля.

При попытке создать объект класса Child, происходит следующее:

  1. В порядке объявления, будут проинициализированы статические блоки и статические переменные в родительском классе.
  2. То же самое произойдет в классе потомке
  3. Инициализация в порядке объявления не статических переменных и не статических блоков инициализации в классе Parent
  4. Вызов конструктора Parent
  5. Инициализация нестатических полей и блоков инициализации в классе Child в порядке объявления
  6. Вызов конструктора Child

Рассмотрим тестовый пример:

Parent.java

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

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

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

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

Child.java

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

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

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


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

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

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

Создание Child объекта:

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

Вывод будет следующий:

parent static variable
parent static block
child static variable
child static block
parent non static block
parent non static variable
parent contructor
child non static variable
child non static
child contructor