局部内部类访问方法的参数和局部变量必须是final的

        内部类的种类一共分为四种,我看其他几种内部类的时候思路都是很清晰的,然后我就碰到了这一条:“方法中的内部类可以访问外部类成员。对于方法的参数和局部变量,必须有final修饰才可以访问”。于是我就有点疑惑,为什么必须是final的?

        于是我就试了一下访问不是final的变量,发现eclipse给出了错误提示:Cannot refer to the non-final local variable localVal defined in an enclosing scope。不能在一个即将关闭的作用域内尝试引用一个非final的变量。差不多我就理解了,因为方法内的参数或者是局部变量的话,当这个方法执行结束之后,它们也就被释放了。加入内部类中的一个引用指向了这个局部变量,再次尝试访问时,就会发生错误。

       给出下面的例子:

  1. public class AnonymousClass {  
  2.     public Object makeInner(String localVal){  
  3.         return new Object(){  
  4.             private String s = localVal;  
  5.             public String toString(){  
  6.                 return s;  
  7.             }  
  8.         };  
  9.     }  
  10.     public static void main(String[] args) {  
  11.         AnonymousClass ac = new AnonymousClass();  
  12.         Object ob = ac.makeInner("23");  
  13.         System.out.println(o.toString());  
  14.     }  
  15. }  

      程序new了一个类对象,然后调用了makeInner方法,传递了一个String类型的参数,进入到方法内部,返回了一个内部匿名类。匿名类中成员引用变量s跟参数localVal指向相同的内存地址,并在重写的toString方法中,返回了成员变量s。调用结束,localVal指向的内存空间释放,返回到主程序,调用ob的toString方法,输出s,但是此时的s指向的内存地址已经被释放了,所以程序是不会让你这么干的。所以内部类访问所在方法的参数或局部变量为什么必须是final的,因为方法结束之后他们空间并没有释放,依然是有效的。

原文地址:https://www.cnblogs.com/qjjazry/p/6112315.html