What is an initialization block? What is an initialization block? java java

What is an initialization block?


First of all, there are two types of initialization blocks:

  • instance initialization blocks, and
  • static initialization blocks.

This code should illustrate the use of them and in which order they are executed:

public class Test {    static int staticVariable;    int nonStaticVariable;            // Static initialization block:    // Runs once (when the class is initialized)    static {        System.out.println("Static initalization.");        staticVariable = 5;    }    // Instance initialization block:    // Runs each time you instantiate an object    {        System.out.println("Instance initialization.");        nonStaticVariable = 7;    }    public Test() {        System.out.println("Constructor.");    }    public static void main(String[] args) {        new Test();        new Test();    }}

Prints:

Static initalization.Instance initialization.Constructor.Instance initialization.Constructor.

Instance itialization blocks are useful if you want to have some code run regardless of which constructor is used or if you want to do some instance initialization for anonymous classes.


would like to add to @aioobe's answer

Order of execution:

  1. static initialization blocks of super classes

  2. static initialization blocks of the class

  3. instance initialization blocks of super classes

  4. constructors of super classes

  5. instance initialization blocks of the class

  6. constructor of the class.

A couple of additional points to keep in mind (point 1 is reiteration of @aioobe's answer):

  1. The code in static initialization block will be executed at class load time (and yes, that means only once per class load), before any instances of the class are constructed and before any static methods are called.

  2. The instance initialization block is actually copied by the Java compiler into every constructor the class has. So every time the code in instance initialization block is executed exactly before the code in constructor.


nice answer by aioobeadding few more points

public class StaticTest extends parent {    static {        System.out.println("inside satic block");    }    StaticTest() {        System.out.println("inside constructor of child");    }    {        System.out.println("inside initialization block");    }    public static void main(String[] args) {        new StaticTest();        new StaticTest();        System.out.println("inside main");    }}class parent {    static {        System.out.println("inside parent Static block");    }    {        System.out.println("inside parent initialisation block");    }    parent() {        System.out.println("inside parent constructor");    }}

this gives

inside parent Static blockinside satic blockinside parent initialisation blockinside parent constructorinside initialization blockinside constructor of childinside parent initialisation blockinside parent constructorinside initialization blockinside constructor of childinside main

its like stating the obvious but seems a little more clear.