DEV Community

Cover image for Static Keyword: Decoding Static Variables in Java
Arshi Saxena
Arshi Saxena

Posted on

Static Keyword: Decoding Static Variables in Java

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

  1. Class-level variable: Shared by all instances of the class.
  2. Initialized once: When the class is loaded by the JVM.
  3. Memory location: Stored in the Method Area.
  4. 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);
    }
}
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Key Concepts Demonstrated:

  1. Static Variables:

    • Shared across all instances and retain their value between instances.
    • Example: idCounter tracks how many employees have been created.
  2. Static Final Variables:

    • Constants whose values are assigned once and never change.
    • Example: COMPANY_NAME and OFFICE_CODE.
  3. Static Block:

    • Executes once when the class is loaded.
    • Used to initialize complex static variables such as OFFICE_CODE based on environment configurations.
  4. Instance Variables and Methods:

    • Each instance has unique values for employeeId and employeeName.
  5. Class-Level Access to Static Variables:

    • The idCounter is accessed using the class name:
     System.out.println("Total Employees: " + StaticVariables.idCounter);
    

When to Use Static Variables?

  1. Global Counters: Useful for tracking common state, such as ID generators or counters.
  2. Configuration Settings: Store values that remain constant, like application-level configurations.
  3. 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)