2011-06-05 12 views
5

posibles duplicados:
Cannot refer to a non-final variable inside an inner class defined in a different method
Why inner classes require “final” outer instance variables [Java] ?clases Java interiores

class MyOuter {  

    private String x = "Outer"; 
    void doStuff(){ 
      final String z = "local variable"; 
      class MyInner { 
       public void seeOuter(){ 
         System.out.println("Outer x is" + x); 
         System.out.println("Local variable z is" + z); // does 
         // not compile if final keyword from String z is removed 
       } 
      } 
    } 
} 

El código anterior funciona bien. Quiero saber por qué el compilador da un error si elimino la palabra clave final de String z. ¿Qué diferencia hace la palabra clave final?

Respuesta

3

Su clase myInner no puede realmente "ver" la variable de ámbito de método z a la que hace referencia. El compilador simplemente le da a la clase interna su propia copia privada de z. Por lo tanto, si cambiara z más tarde, su programa podría "romperse" de manera misteriosa, ya que el código "parece" es la misma variable.

Por lo tanto, el compilador no le permitirá escribir ese código a menos que prometa que comprende que z no puede cambiar más adelante, al declararlo como definitivo.

0

1) z es una referencia a String que vive en el hilo actual pila. Ahora, supongamos que en tu clase interna comienzas un hilo (B) y quieres acceder al z desde B. Pero B no tiene acceso a la pila de A. Para permitir este acceso, Java hace una copia de esta referencia. Pero para asegurarse de que ambos subprocesos no cambien su propio valor, por lo que pondrá a este sistema en un estado incoherente, debe declararlo como definitivo.

Cuestiones relacionadas