Why Are Static Initializers Used in Java?
A static initializer (also called a static block) is a block of code that executes once when the class is loaded into memory. It is mainly used to initialize static variables and perform one-time setup before any objects are created.
Key Reasons to Use Static Initializers
- Initialize Static Variables with Complex Logic
- When a static variable requires complex calculations, file reading, or database connections.
- Run Code Once at Class Loading
- The static block executes only once when the class is first referenced.
- Avoid Redundant Code in Multiple Constructors
- If multiple constructors need to initialize a static resource, a static block ensures it happens only once.
- Perform Static Dependency Setup
- If a class relies on external configuration files, logging, or environment settings.
Example 1: Static Initialization of a Static Variable
class Config {
static String databaseUrl;
// Static Block
static {
System.out.println("Static block executed");
databaseUrl = "jdbc:mysql://localhost:3306/mydb";
}
}
public class Main {
public static void main(String[] args) {
System.out.println(Config.databaseUrl); // Static block runs before accessing the variable
}
}
Output:
Static block executed
jdbc:mysql://localhost:3306/mydb
📌 Key Takeaway: The static block executes only once, ensuring databaseUrl
is initialized before first use.
Example 2: Loading Configuration from a File
import java.io.*;
class ConfigLoader {
static String settings;
static {
try {
BufferedReader br = new BufferedReader(new FileReader("config.txt"));
settings = br.readLine();
br.close();
} catch (IOException e) {
settings = "Default Settings";
}
}
}
public class Main {
public static void main(String[] args) {
System.out.println(ConfigLoader.settings); // Reads from file
}
}
📌 Key Takeaway: The static block initializes the settings
variable once when the class loads, allowing configuration to be read from a file.
Example 3: Using Static Blocks in Class Hierarchy
class Parent {
static { System.out.println("Parent Static Block"); }
}
class Child extends Parent {
static { System.out.println("Child Static Block"); }
}
public class Main {
public static void main(String[] args) {
System.out.println("Main method started");
Child c = new Child();
}
}
Output:
Parent Static Block
Child Static Block
Main method started
📌 Key Takeaway: Parent static blocks run before child static blocks when the class is first loaded.
Rules for Static Initializers
✅ Executes Only Once – When the class is loaded.
✅ Runs Before Any Object Creation – Even if no objects are created.
✅ Cannot Access Instance Variables – Because static blocks belong to the class, not objects.
✅ Multiple Static Blocks Execute in Order – If a class has multiple static blocks, they run top-down.
Example:
class Test {
static { System.out.println("First Static Block"); }
static { System.out.println("Second Static Block"); }
}
public class Main {
public static void main(String[] args) {
Test t1 = new Test();
Test t2 = new Test(); // Static blocks do NOT run again
}
}
Output:
First Static Block
Second Static Block
📌 Key Takeaway: Static blocks execute once per class, even if multiple objects are created.
When to Use Static Initializers
Use Case | Why Use Static Block? |
---|---|
Initializing Static Variables | Ensures proper one-time setup |
Loading Configurations | Reads from files, databases, or environment variables |
Logging Setup | Initializes logging frameworks before main execution |
Complex Static Calculations | Runs pre-processing logic before class usage |
Conclusion
- Static initializers execute once when the class loads.
- Used for complex static variable initialization.
- Helps avoid redundant code in constructors.
- Executes before
main()
or object creation. - Cannot access instance variables or methods.