You are currently viewing Understanding the Order of Initialization in Java
java_logo

Understanding the Order of Initialization in Java

Initialization is a crucial aspect of Java programming, determining the state of objects and variables during their lifecycle. The order in which various components are initialized can significantly impact the behavior of your Java program.

1. Class Loading and Initialization:

When a Java program starts, the Java Virtual Machine (JVM) loads the classes needed into memory.
Classes are initialized in a specific order to ensure that dependencies are resolved correctly.

2. Static Initialization

Static variables and static blocks are initialized in the order they appear in the class.
Static variables are initialized only once, at the beginning of the class initialization.

public class InitializationExample {
    // Static variable
    static int staticVar = 10;

    // Static block
    static {
        System.out.println("Static Block 1: " + staticVar);
    }

    // Another static block
    static {
        System.out.println("Static Block 2");
    }

    public static void main(String[] args) {
        System.out.println("Main Method");
    }
}

Output:
Static Block 1: 10
Static Block 2
Main Method

3. Instance Initialization

Instance variables are initialized when an instance of the class is created.
Instance blocks are executed in the order they appear in the class, followed by member field initialization.

public class InitializationExample {
    // Member field
    int memberField;

    // Instance block
    {
        System.out.println("Instance Block 1: " + memberField);
        memberField = 20;  // Initialization of member field
    }

    // Another instance block
    {
        System.out.println("Instance Block 2: " + memberField);
    }

    public static void main(String[] args) {
        new InitializationExample();
    }
}

Output:
Instance Block 1: 0
Instance Block 2: 20

4. Constructor Initialization

Constructors are executed after the instance blocks.
They allow further customization of object initialization, including additional member field assignments.

public class InitializationExample {
    // Member field
    int memberField;

    // Constructor
    public InitializationExample() {
        System.out.println("Constructor: " + memberField);
        memberField = 30;  // Further initialization of member field
    }

    public static void main(String[] args) {
     InitializationExample initializationExample = new InitializationExample();
        System.out.println("memberfield: " + initializationExample.memberField);
    }
}

Output:
Constructor: 0
memberfield: 30

Now let’s create an example that combines static initialization, instance initialization, and constructor initialization in a single class:

public class ComprehensiveInitializationExample {

    // Static variable
    static int staticVar = initializeStaticVar();

    // Instance variable
    int instanceVar = initializeInstanceVar();

    // Static block
    static {
        System.out.println("Static Block: " + staticVar);
    }

    // Instance block
    {
        System.out.println("Instance Block: " + instanceVar);
    }

    // Constructor
    public ComprehensiveInitializationExample() {
        System.out.println("Constructor: " + instanceVar);
    }

    // Method to initialize staticVar
    static int initializeStaticVar() {
        System.out.println("Initializing staticVar");
        return 10;
    }

    // Method to initialize instanceVar
    int initializeInstanceVar() {
        System.out.println("Initializing instanceVar");
        return 20;
    }

    public static void main(String[] args) {
        new ComprehensiveInitializationExample();
    }
}

Output:
Initializing staticVar
Static Block: 10
Initializing instanceVar
Instance Block: 20
Constructor: 20

Explanation:
staticVar is initialized by the method initializeStaticVar() during the class loading phase.
The static block is executed after the static variable is initialized.
instanceVar is initialized by the method initializeInstanceVar() for each instance of the class.
The instance block is executed after the instance variable is initialized.
The constructor is executed after the instance block, allowing further customization of instance initialization.