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(); } } ```