Are fields initialized before constructor code is run in Java?

constructor, initialization, java

Solution

The correct order of initialisation is:

- Static variable initialisers and static initialisation blocks, in textual order, if the class hasn't been previously initialised.

- The super() call in the constructor, whether explicit or implicit.

- Instance variable initialisers and instance initialisation blocks, in textual order.

- Remaining body of constructor after super().

See sections §2.17.5-6 of the Java Virtual Machine Specification.

Problem

Can anyone explain the output of following program? I thought constructors are initialized before instance variables. So I was expecting the output to be "XZYY". ``` class X { Y b = new Y(); X() { System.out.print("X"); } } class Y { Y() { System.out.print("Y"); } } public class Z extends X { Y y = new Y(); Z() { System.out.print("Z"); } public static void main(String[] args) { new Z(); } } ```

Original source

Related problems