Java内部类

时间:2011-06-05 22:22:44

标签: java

  

可能重复:
  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] ?

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

上面的代码工作正常。 我想知道如果从String z中删除final关键字,编译器为什么会出错。最终的关键字制作有什么区别?

2 个答案:

答案 0 :(得分:3)

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

因此,编译器不允许您编写该代码,除非您承诺通过将其声明为最终来理解z后来无法更改。

答案 1 :(得分:0)

1)z是对{em>当前主题 堆栈 String的引用。现在,让我们假设在你的内部类中你启动一个线程(B)并且你想从B访问z但是B没有访问A的堆栈。为了允许此访问,Java会复制此引用。但是为了确保两个线程都不会改变它们自己的值,这样就会使这个系统处于不一致的状态,你必须将它声明为final。