I have two classes Parent and Child
public class Parent { public Parent() { System.out.println("Parent Constructor"); } static { System.out.println("Parent static block"); } { System.out.println("Parent initialisation block"); } } public class Child extends Parent { { System.out.println("Child initialisation block"); } static { System.out.println("Child static block"); } public Child() { System.out.println("Child Constructor"); } public static void main(String[] args) { new Child(); } }
The output of the above code will be
Parent static block Child static block Parent initialization block Parent Constructor Child initialization block Child Constructor
Why does Java execute the code in that order? What are the rules that determine the execution order?
The first block to execute has the lowest execution order, which is usually 1 . The displayed execution order may skip numbers, but the blocks always execute in order of the visible numbers.
If you want to execute static block you need to have Main method and, static blocks of the class get executed before main method.
There is an order in which static block/method/variable gets initialized. Static Blocks are called even before the main method which is nothing but a static method i.e. execution point of every class.
Order of execution When you have all the three in one class, the static blocks are executed first, followed by constructors and then the instance methods.
I learn visually, so here's a visual representation of order, as a SSCCE:
public class Example { static { step(1); } public static int step_2 = step(2); public int step_8 = step(8); public Example(int unused) { super(); step(10); } { step(9); } // Just for demonstration purposes: public static int step(int step) { System.out.println("Step " + step); return step; } }
public class ExampleSubclass extends Example { { step(11); } public static int step_3 = step(3); public int step_12 = step(12); static { step(4); } public ExampleSubclass(int unused) { super(step(7)); step(13); } public static void main(String[] args) { step(5); new ExampleSubclass(step(6)); step(14); } }
This prints:
Step 1 Step 2 Step 3 Step 4 Step 5 Step 6 Step 7 Step 8 Step 9 Step 10 Step 11 Step 12 Step 13 Step 14
Keep in mind that the order of the static
parts matters; look back at the difference between the order of Example
's static
stuff and ExampleSubclass
's.
Also note that the instance initialization block is always executed immediately after the super()
call in the constructor (even if that call is implied/omitted), no matter the order. However, order does matter between an initialization block and a field initializer.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With