2012-07-05 10 views
35

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

public class Ex 
{ 
    final int q; 
} 

Cuando puedo compilar el código consigo error como este

err: variable q no podría haber sido inicializado

+0

Una propiedad de la palabra clave final es que garantiza que una variable no puede cambiar de estado una vez que se ha inicializado. Obliga al usuario a inicializarse cuando se declara o en un constructor. –

+1

Consulte [this] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.4). – user1329572

+3

Un campo 'final' debe establecerse una sola vez. El compilador solo puede estar seguro de que este sea el caso si está configurado en un constructor. –

Respuesta

2

El modificador final evita que el de changeing el valor de las variables, por lo tanto, usted tiene para inicializarlo donde lo declaras.

14

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

En su caso, se llamaría blank final porque no se inicializa cuando se declara.

0

Final modifier no permite change your variable value .Así que necesita asignarle un valor en algún lugar y constructor es el lugar donde debe hacer esto en este caso.

0

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.

11

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.

6

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

  • en una primitiva, evita que el valor de la primitiva de ser cambiado (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á configurarlo una vez, y no podrá hacer this.a=new HashMap<String,String>(); otra vez, pero nada le impide hacer this.a.put("a","b"), s ya que eso no modifica la referencia, solo el contenido del objeto.
9

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

Si no se ha inicializado cuando el constructor vuelve, es posible 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 Wikipedia excerpt lo explica así:

Una variable definitiva sólo se puede inicializar una vez, ya sea a través de un inicializador o una instrucció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 puede ser re-obligado a hacer referencia a otro objeto, pero el objeto al que hace referencia sigue siendo mutable, si era originalmente mutable..)

29

El oficial razón es que se define por la Java Language Spefication 8.3.1.2:

Una variable de instancia en blanco debe ser definitivamente asignado al final de cada constructor de 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).

+0

El constructor predeterminado debería haberse inicializado a los valores predeterminados ¿no? Lo hace para las variables no finales, pero ¿por qué no para las variables finales? – Sunil

+2

Esta respuesta solo reafirma el comportamiento al que se refiere OP. No indica la razón del comportamiento, que es la pregunta que hizo OP. – ineedahero

+0

@ineedahero Creo que he respondido la pregunta de la operación: porque el lenguaje está definido de esa manera. Por qué se definió de esa manera es una pregunta para quien escribió la especificación y, a menos que él o ella esté cerca, solo podemos hacer una conjetura ... – assylias

Cuestiones relacionadas