为什么Java内部类需要“最终”外部实例变量?final JTextField jtfContent = new JTextField();btnOK.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent event){
jtfContent.setText("I am OK");
}} );如果我省略final,我看到错误“ 不能引用在不同方法中定义的内部类中的非最终变量jtfContent ”。为什么匿名内部类必须要求外部类实例变量为final才能访问它?
3 回答
慕盖茨4494581
TA贡献1850条经验 获得超11个赞
首先,让我们都放松一下,请把那把枪放下。
好。现在语言坚持的原因是它为了让你的内部类函数能够访问他们渴望的局部变量而作弊。运行时会生成本地执行上下文的副本(以及适当的等等),因此它坚持要您创建所有内容final
以使其保持诚实。
如果它不这样做,那么在构造对象之后但在内部类函数运行之前更改局部变量值的代码可能会令人困惑和奇怪。
这是围绕Java和“闭包”的许多骚动的本质。
注意:开头段落是关于OP原始构成中的一些全文字幕的笑话。
函数式编程
TA贡献1807条经验 获得超9个赞
原因是Java不完全支持所谓的“闭包” - 在这种情况下final
没有必要 - 但是通过让编译器生成一些隐藏变量来发现一个技巧,这些变量用于提供您看到的功能。
如果您反汇编生成的字节代码,您可以看到编译器如何执行它,包括包含最终变量副本的奇怪命名的隐藏变量。
这是一种优雅的解决方案,可以在不向后弯曲语言的情况下提供功能。
编辑:对于Java 8,lambdas提供了一种更简洁的方式来完成以前使用匿名类完成的操作。对变量的限制也从“最终”松散到“基本上是最终的” - 你不必将其声明为final,但如果它被视为最终(你可以添加final关键字,你的代码仍然可以编译)可以使用。这是一个非常好的变化。
添加回答
举报
0/150
提交
取消