Java Static and Final

The static and final Keywords in Java

The static and final keywords are fundamental in Java, providing a variety of functionalities and design advantages. They can be applied to variables, methods, blocks, and classes, each with specific implications and behaviors.

The static Keyword

The static keyword is used to indicate that a particular member belongs to the class itself, rather than to instances of the class. It can be used with variables, methods, blocks, and nested classes.

Static Variables

Static variables, also known as class variables, are shared among all instances of a class. They are initialized only once and retain their value across all instances.

  • Example:
Java
  public class StaticVariableExample {
      static int count = 0;

      public StaticVariableExample() {
          count++;
      }

      public static void main(String[] args) {
          StaticVariableExample obj1 = new StaticVariableExample();
          StaticVariableExample obj2 = new StaticVariableExample();
          StaticVariableExample obj3 = new StaticVariableExample();

          System.out.println("Number of objects created: " + StaticVariableExample.count);
      }
  }

Static Methods

Static methods can be called without creating an instance of the class. They can access static variables and other static methods directly.

  • Example:
Java
  public class StaticMethodExample {
      static int cube(int n) {
          return n * n * n;
      }

      public static void main(String[] args) {
          int result = StaticMethodExample.cube(3);
          System.out.println("Cube of 3 is: " + result);
      }
  }

Static Blocks

Static blocks are used to initialize static variables. They are executed when the class is loaded into memory.

  • Example:
Java
  public class StaticBlockExample {
      static int data;

      static {
          data = 50;
          System.out.println("Static block initialized. Data = " + data);
      }

      public static void main(String[] args) {
          System.out.println("Data from main method: " + data);
      }
  }

Static Nested Classes

Static nested classes do not have access to instance variables and methods of the outer class. They can access static members of the outer class.

  • Example:
Java
  public class OuterClass {
      static int data = 30;

      static class InnerClass {
          void display() {
              System.out.println("Data: " + data);
          }
      }

      public static void main(String[] args) {
          OuterClass.InnerClass inner = new OuterClass.InnerClass();
          inner.display();
      }
  }

The final Keyword

The final keyword is used to declare constants and to restrict inheritance, method overriding, and reinitialization. It can be applied to variables, methods, and classes.

Final Variables

Final variables are constants. Once initialized, their value cannot be changed.

  • Example:
Java
  public class FinalVariableExample {
      final int speedLimit = 90;

      public static void main(String[] args) {
          FinalVariableExample obj = new FinalVariableExample();
          System.out.println("Speed limit is: " + obj.speedLimit);
      }
  }

Final Methods

Final methods cannot be overridden by subclasses. This ensures that the method’s behavior remains unchanged in subclasses.

  • Example:
Java
  class Bike {
      final void run() {
          System.out.println("Running at a constant speed.");
      }
  }

  class Honda extends Bike {
      // void run() { // This would cause a compile-time error
      //     System.out.println("Cannot override this method.");
      // }
  }

  public class FinalMethodExample {
      public static void main(String[] args) {
          Honda honda = new Honda();
          honda.run();
      }
  }

Final Classes

Final classes cannot be subclassed. This is useful for creating immutable classes or for security reasons.

  • Example:
Java
  final class Car {
      void drive() {
          System.out.println("Driving safely.");
      }
  }

  // class SportsCar extends Car { // This would cause a compile-time error
  // }

  public class FinalClassExample {
      public static void main(String[] args) {
          Car car = new Car();
          car.drive();
      }
  }

Combining static and final

When used together, static and final keywords can create constants that are shared across all instances of a class.

  • Example:
Java
  public class StaticFinalExample {
      static final int MAX_VALUE = 100;

      public static void main(String[] args) {
          System.out.println("Max value is: " + MAX_VALUE);
      }
  }

Practical Examples and Scenarios

Singleton Pattern with static and final

The Singleton pattern ensures that a class has only one instance and provides a global point of access to it.

  • Example:
Java
  public class Singleton {
      private static final Singleton instance = new Singleton();

      private Singleton() {
          // Private constructor to prevent instantiation
      }

      public static Singleton getInstance() {
          return instance;
      }

      public void showMessage() {
          System.out.println("Hello, this is a Singleton class.");
      }

      public static void main(String[] args) {
          Singleton singleton = Singleton.getInstance();
          singleton.showMessage();
      }
  }

Utility Class with static Methods

Utility classes often contain static methods that provide common functionality across an application.

  • Example:
Java
  public class MathUtils {
      public static int add(int a, int b) {
          return a + b;
      }

      public static int subtract(int a, int b) {
          return a - b;
      }

      public static void main(String[] args) {
          System.out.println("Addition: " + MathUtils.add(10, 5));
          System.out.println("Subtraction: " + MathUtils.subtract(10, 5));
      }
  }

Summary

The static and final keywords are powerful tools in Java, providing mechanisms to share data across instances and to define immutable data, methods, and classes. By understanding and leveraging these keywords, you can create more efficient, robust, and maintainable Java applications.

Scroll to Top