2011-06-05 51 views
5

可能重复:
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] ?的Java内部类

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 
       } 
      } 
    } 
} 

上面的代码工作正常。 我想知道为什么编译器给出一个错误,如果我从字符串z中删除最后一个关键字。最终的关键字制作有什么不同?

回答

3

您的类myInner实际上不能“看到”您引用的方法范围变量z。编译器只是给内部类自己的私有副本z。因此,如果以后要更改z,程序可能会以神秘的方式“破解”,因为代码使其看起来像是同一个变量。

因此,编译器不会让你编写该代码,除非你保证你知道z以后不能更改,通过声明它是最终的。

0

1)zString的引用住在当前线程。现在,让我们假设在你的内部类中你启动了一个线程(B)并且你想从B访问z。但是B没有访问A的堆栈。为了允许这种访问,Java制作了这个引用的副本。但为了确保两个线程都不会改变自己的价值,所以会使这个系统处于不一致的状态,您必须声明它是最终的。