In Java, the final keyword makes variables immutable (unchangeable). Normally, you initialize a final variable at declaration time (e.g. final int MAX = 100;). However, Java also supports Blank Final Variables—final variables that are declared without an initial value.

A blank final variable must be initialized inside the constructor of the class. If you fail to initialize it, the compiler throws an error. Once initialized, it freezes and cannot be changed.

Visualizing blank final initialization
Real-World Analogy: Custom Engraved Birthday Trophies

Imagine you run a trophy workshop. You purchase blank trophies (blank final variables) from the supplier. They have no name engraved on them yet.

When a customer orders a trophy, you bring it into the assembly workshop (the constructor). There, you engrave the winner's name on it. Once the trophy leaves the workshop, the name is carved in metal and sealed. It can never be changed again.

Java Implementation

In this class, MAX_SIZE is a blank final variable. It is initialized in both overloaded constructors but cannot be modified inside the finals() method:

package io.practise;
 
class Serialisehasa {
  // Declaring a Blank Final variable
  final int MAX_SIZE;
 
  // Constructor 1: Default
  Serialisehasa() {
    MAX_SIZE = 10; // Initialize here
    System.out.println("Default MAX_SIZE: " + MAX_SIZE);
  }
 
  // Constructor 2: Overloaded
  Serialisehasa(int a) {
    MAX_SIZE = a; // Or initialize here
    System.out.println("Custom MAX_SIZE: " + MAX_SIZE);
  }
 
  public static void main(String[] args) {
    Serialisehasa f = new Serialisehasa();
    Serialisehasa f1 = new Serialisehasa(20);
    f1.finals();
  }
 
  void finals() {
    // MAX_SIZE = 90; // COMPILER ERROR: Cannot assign a value to final variable 'MAX_SIZE'
    System.out.println("Current value: " + MAX_SIZE);
  }
}

Conclusion

Blank final variables are useful when you want to establish immutable configuration parameters that depend on constructor input parameters passed at runtime instantiation.