【发布时间】:2011-08-13 16:42:16
【问题描述】:
在编译器错误Cannot refer to a non-final variable message inside an inner class defined in a different method 上有一些关于 Stack Overflow 的主题,解决方案是“将其声明为最终的,你就完成了”,但是我想通过这个 理论上的问题检查这段代码无法编译的逻辑原因是什么:
private void updateStatus(String message) {
Runnable doUpdateStatus = new Runnable() {
public void run() {
/* do something with message */
}
}
/* do something with doUpdateStatus, like SwingUtilities.invokeLater() */
}
(解决方案:将message 声明为最终结果)而这个是:
private String enclosingClassField;
private void updateStatus() {
Runnable doUpdateStatus = new Runnable() {
public void run() {
/* do something with enclosingClassField */
}
}
/* do something with doUpdateStatus, like SwingUtilities.invokeLater() */
}
我真的很困惑。 enclosingClassField 不是最终的,它可以每次更改很多次,而 updateStatus 的可怜的 message 参数只能在其方法体内更改,而是被编译器指责;)
即使是编译器错误也会误导我。 Cannot refer to a non-final variable message inside an inner class defined in a different method:和什么不同? message 不是定义在和内部类相同的方法中吗? enclosingClassField 不是在方法之外定义的吗?嗯……
有人可以指出我对此事的正确解释吗?谢谢。
【问题讨论】:
标签: java