usar programacion métodos metodos metodo estáticos estaticos ejemplos cuando creación clases atributos atributo java static final static-block

java - programacion - ¿Por qué no podemos establecer el valor de la variable final estática en bloque estático a través del nombre de clase



static final java (1)

Una variable final estática debe ser inicializada antes de su uso. Se puede inicializar directamente en el momento de la declaración o en un bloque estático.

Pero cuando usa class.var = x no se ve como una inicialización sino como una asignación.

Con un JDK 7, el error no puede asignar un valor a la variable final .

Eso explica por qué funciona si eliminas la palabra clave final

class Test { static final int a = 2; // initialization at declaration time static final int b; static final int c; static { b = 4; // initialization in static block Test.c = 6; // error : cannot assign a value to final variable c } ... }

EDITAR

En el JLS, la palabra correcta para la inicialización es asignación definida.

Extracto del JLS:

Para cada acceso de una variable local o campo final en blanco x, x debe asignarse definitivamente antes del acceso, o se produce un error en tiempo de compilación.

Del mismo modo, cada variable final en blanco debe asignarse como máximo una vez; debe quedar definitivamente sin asignar cuando se le asigna una asignación.

Dicha asignación se define para ocurrir si y solo si el nombre simple de la variable (o, para un campo, su nombre simple calificado por este) ocurre en el lado izquierdo de un operador de asignación.

Para cada asignación a una variable final en blanco, la variable debe estar definitivamente sin asignar antes de la asignación, o se produce un error en tiempo de compilación.

Enfatiza el mío, pero creo que esta es la verdadera razón del error.

Por ejemplo, considere el código a continuación:

public static final int a; public static final int b; static { a = 8; // it''s working Test.b = 10; // compilation error Test.b cannot be assigned. }

¿Por qué no podemos usar Test.b = 10; ¿Dentro de un bloque estático de la clase Test ? Sin el nombre de la clase está funcionando bien.

¿Hay alguna razón detrás de esto?