Method-local inner class & final variables (forum javaranch)

A method-local inner class cannot use variables declared within the method (including parameters) unless those variables are marked final. (porque???)



If i try to compile the following code: 


  2. public class MyOuter2 {  
  3.     private String x = “Outer2”;  
  4.     void doStuff() {  
  5.         final int a = 10;  
  6.         class MyInner   {  
  7.             public void seeOuter() {  
  8.                 System.out.println(“Outer x is “ + x);  
  9.                 System.out.println(“a= “ + a);  
  10.             } // close inner class method  
  11.         } // close inner class definition  
  12.         MyInner mi = new MyInner(); // This line must come  
  13.         // after the class  
  14.         mi.seeOuter();  
  15.     } // close outer class method doStuff()  
  16. // close outer class  


It works fine. But if i change final int a to int a. Compilation fails. What is the reason that the code works for final local variable. 




Short answer. It is defined in the specification as such. 


Longer answer. Technically neither should work. The scope of the class (even method local class), is not the same as the scope for local variables. It is possible to store objects (or return objects) of the method local class, and hence, it is possible for the local variable to be out of scope when the object needs them. 


Now… in the specification, final variables are allowed. The reason is, since final variables do not change, and it is possible for the compiler to detect whether it has been initialized, that if so… it is allowed, because the inner class can make a copy of the variable. 




Colado de <

Esta entrada foi publicada em inner class com as etiquetas . ligação permanente.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da

Está a comentar usando a sua conta Terminar Sessão /  Alterar )

Google photo

Está a comentar usando a sua conta Google Terminar Sessão /  Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão /  Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão /  Alterar )

Connecting to %s