Why Are Initialization Blocks Needed in Java?
Initialization blocks in Java are used to execute code during object creation or class loading before the constructor runs. They help to:
- Eliminate Code Duplication – If multiple constructors need to execute the same code, an initialization block can reduce redundancy.
- Initialize Instance Variables – When initialization logic is complex and cannot be done inline.
- Perform Setup Before Constructor Execution – Ensuring required setup happens before the constructor is called.
Types of Initialization Blocks
There are two types of initialization blocks in Java:
Type | When It Executes | Belongs To | Execution Order |
---|---|---|---|
Instance Initialization Block (IIB) | Runs before the constructor when an object is created | Instance (non-static) | Parent IIB → Child IIB → Parent Constructor → Child Constructor |
Static Initialization Block (SIB) | Runs once when the class is loaded | Class (static) | Parent SIB → Child SIB |
1. Instance Initialization Block (IIB)
✅ Used to Initialize Instance Variables Before Constructor
- Runs every time an object is created.
- Executes before the constructor.
- Useful when multiple constructors share the same initialization logic.
Example:
class Person {
private String name;
// Instance Initialization Block
{
System.out.println("Instance Block Executed");
name = "Default Name";
}
// Constructor
Person() {
System.out.println("Constructor Executed");
}
void display() {
System.out.println("Name: " + name);
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person(); // Triggers IIB before constructor
p1.display();
}
}
Output:
Instance Block Executed
Constructor Executed
Name: Default Name
🚀 Key Takeaway: The instance block runs before the constructor and initializes instance variables.
2. Static Initialization Block (SIB)
✅ Used for Class-Level Initialization
- Runs only once when the class is loaded into memory.
- Used to initialize static variables.
Example:
class Database {
static String connection;
// Static Initialization Block
static {
System.out.println("Static Block Executed");
connection = "Connected to Database";
}
static void showConnection() {
System.out.println(connection);
}
}
public class Main {
public static void main(String[] args) {
Database.showConnection(); // Triggers static block only once
}
}
Output:
Static Block Executed
Connected to Database
🚀 Key Takeaway: The static block runs only once when the class is loaded, regardless of object creation.
Execution Order in a Class Hierarchy
When dealing with inheritance, initialization blocks execute top-down in the following order:
- Parent Static Block
- Child Static Block
- Parent Instance Block
- Parent Constructor
- Child Instance Block
- Child Constructor
class Parent {
static { System.out.println("Parent Static Block"); }
{ System.out.println("Parent Instance Block"); }
Parent() { System.out.println("Parent Constructor"); }
}
class Child extends Parent {
static { System.out.println("Child Static Block"); }
{ System.out.println("Child Instance Block"); }
Child() { System.out.println("Child Constructor"); }
}
public class Main {
public static void main(String[] args) {
System.out.println("Creating Child Object...");
Child c1 = new Child();
}
}
Output:
Parent Static Block
Child Static Block
Creating Child Object...
Parent Instance Block
Parent Constructor
Child Instance Block
Child Constructor
🔥 Key Takeaway: Static blocks execute first (only once), while instance blocks execute every time an object is created.
When to Use Initialization Blocks?
Scenario | Use Case |
---|---|
Avoid code duplication across constructors | Use Instance Initialization Block |
Initialize static variables when the class loads | Use Static Initialization Block |
Execute code before a constructor runs | Use Instance Initialization Block |
One-time setup for the class (e.g., database connections) | Use Static Initialization Block |
Conclusion
1️⃣ Instance Initialization Blocks (IIB)
- Execute before the constructor when an object is created.
- Run every time a new instance is created.
- Used to initialize instance variables.
2️⃣ Static Initialization Blocks (SIB)
- Execute only once when the class is loaded.
- Used to initialize static variables.
3️⃣ Execution Order in Class Hierarchy
- Parent Static Block → Child Static Block → Parent Instance Block → Parent Constructor → Child Instance Block → Child Constructor