Why must a final variable be initialized before constructor completes?

The official reason is that it is defined by the Java Language Specification 8.3.1.2:

A blank final instance variable must be definitely assigned at the end of every constructor of the class in which it is declared; otherwise a compile-time error occurs.

A blank final is a final variable whose declaration lacks an initializer (i.e. what you describe).


The value of a final variable can only be set once. The constructor is the only place in the code for a class that you can guarantee this will hold true; the constructor is only ever called once for an object but other methods can be called any number of times.


Because final prevents you from modifying variables, but it has to be initialized at some point, and the constructors is the right place to do so.

In your case, it would be called a blank final because it is not initialized when declared.


A final variable must be initialized at the declaration or in a constructor.

If it has not been initialized when the constructor returns, it may never be initialized, and may remain an uninitialized variable. The compiler cannot prove it will be initialized, and thus throws an error.

This Wikipedia excerpt explains it well:

A final variable can only be initialized once, either via an initializer or an assignment statement. It does not need to be initialized at the point of declaration: this is called a "blank final" variable. A blank final instance variable of a class must be definitely assigned at the end of every constructor of the class in which it is declared; similarly, a blank final static variable must be definitely assigned in a static initializer of the class in which it is declared: otherwise, a compile-time error occurs in both cases. (Note: If the variable is a reference, this means that the variable cannot be re-bound to reference another object. But the object that it references is still mutable, if it was originally mutable.)