Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In what order do static blocks and initialization blocks execute when using inheritance?

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?

like image 694
CKR666 Avatar asked Oct 24 '13 08:10

CKR666


People also ask

What is the order of blocks to execute?

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.

Which is executed first static block or static method?

If you want to execute static block you need to have Main method and, static blocks of the class get executed before main method.

Which will execute first static block or static variable?

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.

Which is executed first static block or instance block?

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.


1 Answers

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.

like image 113
Ky. Avatar answered Sep 26 '22 04:09

Ky.