uso tipos subclases sirve que parametros para modificador metodos ejemplos constantes java

java - tipos - ¿Por qué debe inicializarse una variable final antes de que termine el constructor?



tipos de variables en java ejemplos (8)

El modificador final impide cambiar el valor de las variables, por lo tanto, debe inicializarlo donde lo declara.

¿Por qué debe inicializarse una variable final antes de que termine el constructor?

public class Ex { final int q; }

Cuando compilo este código recibo un error como este

err: la variable q podría no haberse inicializado


El valor de una variable final solo se puede establecer una vez. El constructor es el único lugar en el código para una clase que puede garantizar que esto sea verdadero; al constructor solo se le llama una vez por un objeto, pero se pueden llamar otros métodos varias veces.


La especificación del lenguaje contiene garantías específicas sobre las propiedades de variables y campos finales, y una de ellas es que un objeto construido correctamente (es decir, aquel cuyo constructor finalizó correctamente) debe tener todos sus campos de instancia final inicializados y visibles para todos los hilos. Por lo tanto, el compilador analiza las rutas de código y requiere que inicialices esos campos.


La palabra clave final aplicada a un campo tiene uno de dos efectos:

  • en una primitiva, evita que se cambie el valor de la primitiva (un int no puede cambiar el valor)
  • en un objeto, evita que se modifique el "valor de la variable", es decir, la referencia al objeto. Es decir, si tiene un final HashMap<String,String> a , solo podrá establecerlo una vez, y no podrá hacer this.a=new HashMap<String,String>(); de nuevo, pero nada te impide hacer esto. this.a.put("a","b") , ya que eso no modifica la referencia, solo el contenido del objeto.

La razón oficial es que está definida por la Language Spefication de Java 8.3.1.2 :

Una variable de instancia final en blanco debe asignarse definitivamente al final de cada constructor de la clase en la que se declara; de lo contrario, se produce un error en tiempo de compilación.

Una final en blanco es una variable final cuya declaración carece de un inicializador (es decir, lo que usted describe).


Porque el final impide modificar las variables, pero tiene que ser inicializado en algún punto, y los constructores son el lugar correcto para hacerlo.

En su caso, se llamaría una final en blanco porque no se inicializa cuando se declara.


Una variable final debe inicializarse en la declaración o en un constructor.

Si no se ha inicializado cuando el constructor regresa, puede que nunca se inicialice y puede seguir siendo una variable no inicializada. El compilador no puede probar que se inicializará, y arroja un error.

Este extracto de Wikipedia lo explica bien:

Una variable final solo se puede inicializar una vez, ya sea a través de un inicializador o una declaración de asignación. No necesita ser inicializado en el momento de la declaración: esto se llama una variable "final en blanco". Una variable de instancia final en blanco de una clase debe asignarse definitivamente al final de cada constructor de la clase en la que se declara; de forma similar, una variable estática final en blanco debe asignarse definitivamente en un inicializador estático de la clase en la que se declara; de lo contrario, se produce un error en tiempo de compilación en ambos casos. (Nota: si la variable es una referencia, esto significa que la variable no se puede volver a vincular para hacer referencia a otro objeto, pero el objeto al que hace referencia sigue siendo mutable, si fue originalmente mutable).


Final modifier no permite change your variable value . Por lo tanto, debe asignarle un valor en algún lugar y el constructor es el lugar donde debe hacer esto en este caso.