如果我有一个变量 int x = 1
,比如说,我在主线程中声明了一个 runnable,并且我想将 x 传递给 runnable 的 run()
方法,它必须声明为 final
。为什么?
final int x = 0;//<----must be final...
private class myRun implements Runnable {
@Override
public void run() {
x++;//
}
}
最佳答案
因为语言规范就是这么说的。 According to Guy Steele ,此选择背后的基本原理是程序员希望方法中的声明 int x = 0
导致堆栈分配存储,但如果您可以返回 new myRun()
从方法(或以其他方式让 myRun
持续超过函数的返回)并且你可以在之后修改它,然后 x
必须堆分配而不是让您期望的语义。
他们本可以这样做,事实上其他语言也这样做了。但是 Java 设计者决定改为要求您将 x
标记为 final
以避免要求实现堆分配看起来像堆栈分配存储的东西。
(我应该注意:这不是特定于Runnable
。它适用于任何匿名内部类。)
关于java - 为什么传递给 runnable 的变量需要是最终的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11424753/