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

时间:2023-03-09 01:47:43
局部内部类访问方法的参数和局部变量必须是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的,因为方法结束之后他们空间并没有释放,依然是有效的。