Welcome back to the Java Keywords Essentials series! This post is all about static variables—a powerful feature in Java that allows you to share data across multiple objects of the same class.
We'll walk through the purpose, behavior, and key use cases of static variables, with hands-on examples and insights. In a separate post, we’ll dive into static methods to avoid overwhelming you with too much content.
This post builds on concepts discussed in earlier posts. I recommend reviewing Final Keyword and Static Blocks to gain a deeper understanding of the topics covered here.
What are Static Variables?
A static variable belongs to the class rather than an individual instance. It’s shared among all objects of the class and retains the same value across these objects.
Key Characteristics
- Class-level variable: Shared by all instances of the class.
- Initialized once: When the class is loaded by the JVM.
- Memory location: Stored in the Method Area.
- Access: Can be accessed using both the class name and object references (though the class name is preferred).
Code Example: Static Variables in Action
package keywords.static_keyword;
public class StaticVariables {
// Static variable: Shared across all instances of the class
// Automatically initialized to default value on class loading
static int idCounter; // int default value -> 0
// Static final variables
// Must be initialized at declaration or in a static block
static final String COMPANY_NAME = "TechCorp";
static final String OFFICE_CODE;
// Instance variables: Unique to each object
int employeeId;
String employeeName;
// Static final variable Initialized in a static block
static {
// Default region: US
String region = System.getProperty("user.region", "US");
switch (region) {
case "EU":
regionalOfficeCode = "EU-01";
break;
case "APAC":
regionalOfficeCode = "AP-11";
break;
default:
regionalOfficeCode = "US-00";
}
System.out.println("Static Block Invoked: Office Code set to " +
regionalOfficeCode);
}
// Constructor: Assigns a unique ID to each object
public StaticVariables(String name) {
this.employeeName = name;
this.employeeId = ++idCounter; // Incrementing the shared counter
}
// Instance method
// Displays instance details along with shared data(static variables)
void displayEmployeeDetails() {
System.out.println("Employee ID: " + employeeId +
", Name: " + employeeName +
", Company: " + COMPANY_NAME +
", Office Code: " + OFFICE_CODE);
}
public static void main(String[] args) {
// Creating instances to observe static variable behavior
StaticVariables emp1 = new StaticVariables("Alice");
StaticVariables emp2 = new StaticVariables("Bob");
emp1.displayEmployeeDetails();
emp2.displayEmployeeDetails();
// Accessing the static variable directly using the class name
System.out.println("Total Employees: " + StaticVariables.idCounter);
}
}
Explanation of the Code
Output:
Static Block Invoked: Office Code set to US-00
Employee ID: 1, Name: Alice, Company: TechCorp, Office Code: US-00
Employee ID: 2, Name: Bob, Company: TechCorp, Office Code: US-00
Total Employees: 2
Key Concepts Demonstrated:
-
Static Variables:
- Shared across all instances and retain their value between instances.
- Example:
idCounter
tracks how many employees have been created.
-
Static Final Variables:
- Constants whose values are assigned once and never change.
- Example:
COMPANY_NAME
andOFFICE_CODE
.
-
Static Block:
- Executes once when the class is loaded.
- Used to initialize complex static variables such as
OFFICE_CODE
based on environment configurations.
-
Instance Variables and Methods:
- Each instance has unique values for
employeeId
andemployeeName
.
- Each instance has unique values for
-
Class-Level Access to Static Variables:
- The
idCounter
is accessed using the class name:
System.out.println("Total Employees: " + StaticVariables.idCounter);
- The
When to Use Static Variables?
- Global Counters: Useful for tracking common state, such as ID generators or counters.
- Configuration Settings: Store values that remain constant, like application-level configurations.
- Caching: Use static variables to cache frequently used data (with care to manage memory properly).
Conclusion
In this post, we explored static variables—a fundamental feature that enables shared state across instances. Understanding static variables helps write more efficient code, especially when managing data that needs to remain consistent across multiple objects.
In the next post, we’ll take a deep dive into static methods, exploring their behavior, limitations, and best practices.
Related Posts
Happy Coding!
Top comments (0)