2012-04-21 10 views
11

Sé que una vez que una variable final tiene un valor asignado, no se puede cambiar. Sin embargo sólo tengo un par de preguntas con respecto a esto:Java - variables finales

  • Cuando tengo un campo, por ejemplo static final JButton button; fuera de una clase, y luego en el método main, tratar de asignarle un valor, button = new JButton("OK");, me sale un error diciéndome que elimine el modificador final? Sin embargo, dado que la variable original button aún no hace referencia a un objeto que estaba bajo la impresión, ¿podría asignarlo una vez?

  • En segundo lugar, si elimino por completo la referencia al button, entonces tengo static final JButton button; fuera de la clase, mi IDE dice "El botón de campo final en blanco puede no haberse inicializado". ¿Esto significa que se deben inicializar todos los campos finales ? Y si es así, deben inicializarse allí y luego, ya que no puedo iniciarlo más tarde.

  • También, pregunta tonta, pero mi suposición inicial de que cuando una variable final se hace referencia a una instancia o tipo de datos que no se puede asignar a otra cosa es correcta, ¿no?

Este código no es completa, pero se proporciona para ilustrar mi punto:

public class FinalVarTester { 

    static final JButton button; 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     Container container = frame.getContentPane(); 
     container.setLayout(new BorderLayout()); 
     button = new JButton("OK"); 
     container.add(button, BorderLayout.SOUTH); 
    } 

} 

Respuesta

18

Debe inicializar una variable final estática en un inicializador estático o directamente. Así que, o

static final JButton button; 

static { 
    button = new JButton(); 
} 

La especificación del lenguaje Java

static final JButton button = new JButton(); 

o

tiene un poco más de la documentación al respecto: la section about final variables especifica por la que recibe el error de compilación:

It is a compile-time error if a final variable is assigned to unless it is definitely unassigned (§16) immediately prior to the assignment.

y chapter 16 habla de la asignación definida

+0

¿No es obligatoria para inicializar la variable final en el momento de la declaración? –

0

variables finales en ámbito de clase deben ser inicializadas dentro de la declaración o en el constructor. No se puede asignar a una variable final en la función principal a menos que se haya declarado en la función principal. Todos los campos finales deben ser inicializados. Todas las variables deben inicializarse antes de ser utilizadas.

3

final campos deben inicializarse de hecho, ya que este será su valor para el resto del programa.

Una excepción a esto es que una variable final se puede inicializar en el constructor. Como los campos estáticos no pertenecen a una instancia, deben inicializarse (no hay constructor), la inicialización directa, o los bloques de inicialización estáticos son opciones para hacerlo.

En relación con su última pregunta, sí, esta es la razón por la cual se llama final.

0

El problema es el ingenio h inicializando la variable final en un método dentro de la clase (el método principal es también el método :)). En Java, "final" es como constante y podría ser inicializado solo una vez. Hazlo con composición en lugar de agregación.

public class FinalVarTester { 

    static final JButton button = new JButton("OK"); 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     Container container = frame.getContentPane(); 
     container.setLayout(new BorderLayout()); 
     container.add(button, BorderLayout.SOUTH); 
    } 
} 
0

La respuesta correcta es que un static final var es siempre inicializado en el inicio a la clase - ya sea en el valor que proporcione o al valor por defecto (null, 0, false).

0

Una variable final solo se puede inicializar una vez, ya sea mediante 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".

Tipos de variables finales

1) INSTANCIA VARIABLE FINAL:

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

2) VARIABLE static final

Una variable static final en blanco debe ser definitivamente asignado en un inicializador estático de la clase en el que se declara; de lo contrario, se produce un error en tiempo de compilación

En ambos casos, la intención es evitar el uso de la variable final antes de inicializarla.

En su caso, debe inicializarse a través del bloque de inicializador estático que se inicializa cuando se carga la clase.

Ref: http://en.wikipedia.org/wiki/Final_(Java)

0

Una mejor manera agradable Codding:

public class FinalVarTester 
{  
    static final JButton button; 
    public FinalVarTester() 
    {  
     JFrame frame = new JFrame(); 
     Container container = frame.getContentPane(); 
     container.setLayout(new BorderLayout()); 
     container.add(button, BorderLayout.SOUTH); 
     button = new JButton("OK"); 
    } 
    public static void main(String[] args)  
    { 
     FinalVarTester vTester = new FinalVarTester();  
    } 
} 
Cuestiones relacionadas