可能重复:
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关键字,编译器为什么会出错。最终的关键字制作有什么区别?
答案 0 :(得分:3)
您的类myInner实际上无法“看到”您引用的方法范围变量z。编译器只是为内部类提供了自己的z私有副本。因此,如果您稍后更改z,您的程序可能会以神秘的方式“破解”,因为代码使其“看起来像”它是相同的变量。
因此,编译器不允许您编写该代码,除非您承诺通过将其声明为最终来理解z后来无法更改。
答案 1 :(得分:0)
1)z
是对{em>当前主题 堆栈 的String
的引用。现在,让我们假设在你的内部类中你启动一个线程(B)
并且你想从B访问z
但是B没有访问A的堆栈。为了允许此访问,Java会复制此引用。但是为了确保两个线程都不会改变它们自己的值,这样就会使这个系统处于不一致的状态,你必须将它声明为final。