2011-10-09 25 views
7

Duplicar posible:
Why inner classes require “final” outer instance variables [Java]?
Why are only final variables accessible in anonymous class?Método La clase interna local solo puede acceder a la variable local final.¿Por qué?

class Outer{ 
    private String x = "instance variable"; 
    void doStuff(){ 
     String z = "local variable"; 
     class Inner{ 
      public void seeOuter(){ 
      System.out.println("Outer x is : "+ x); 
      System.out.println("Local variable z is : " + z); //won't compile 
     } 
     } 
    } 
} 

Marcado del z variable local como correcciones finales del problema:

final String z = "local variable"; //Now inner object can use it. 


¿Alguien puede explicar lo que está sucediendo?

Sé exactamente por qué no se puede compilar en caso de que intente acceder a una variable local no final.

¿La finalización de una variable local le permite mantenerse con vida incluso si el método se completa y la variable local queda fuera del alcance?

¿Las variables locales finales se almacenan en un montón en lugar de la pila?

Respuesta

2

Con motivo de la variable z locales como correcciones finales del problema: Puede alguien por favor explicar lo que está sucediendo?

Tiene un método de clase local que tiene permiso para acceder a la variable local final en el ámbito en el que se crea.

¿La finalización de una variable local le permite mantenerse con vida incluso si el método se completa y la variable local queda fuera del alcance?

final significa que no se puede cambiar. Nada más.

¿Las variables locales finales se almacenan en un montón en lugar de la pila?

Todas las variables se asignan en la pila, final o no.

Sé exactamente por qué no se puede compilar en caso de que intente acceder a una variable local no final.

Quizás debería pensar en esto porque no está claro para mí que este sea el caso en absoluto.

Una clase anidada puede "acceder" a la variable final, ya que se copian como campos del objeto automáticamente. No admite campos no finales, ya que pueden modificarse, ya sea por el método o por la clase, y esto no se admite porque en realidad hay dos campos/variables diferentes.

+0

: pero la pregunta aquí es ¿por qué marcar una variable de método local final la hace accesible? – Anu11

+0

@ Anu11 Leería el último párrafo nuevamente. ;) –

10

Pueden usar variables locales y parámetros de la función, pero solo los que están declarados final, porque la instancia de clase local debe mantener una copia separada de la variable, ya que puede salir de la función.Entonces, como para no tener la confusión de dos variables modificables con el mismo nombre en el mismo ámbito, la variable se fuerza a ser no modificable.

+1

"ya que puede salir de la función", soy nuevo en Java y no puedo entender esta parte, ¿podría explicar un escenario donde esto podría suceder? Gracias – RVP

+2

Supongamos que la instancia de clase interna se pasa como un argumento de método y el archivo está almacenado como variable de instancia de otro objeto. Así que aunque la variable de método muere al completar METHOD, el objeto de clase INNER supera al método –

+0

"porque la instancia de clase local debe mantener una copia separada de la variable". acceso a todas las variables en ese alcance? ¿Hay algo en la documentación para respaldar esto o algún programa de prueba? Quiero decir, ¿cómo sabemos que las clases internas locales obtienen una copia de esas variables locales? – Solace

Cuestiones relacionadas