Java匿名内部类

3

一个匿名内部类的实例是否存储所有可访问的 final 变量,还是仅存储在该内部类中使用的变量?(即它是否执行某种分析?据我所知,无论如何都会存储对父实例的引用。)


我相信这个线程可以有所帮助:https://dev59.com/5G445IYBdhLWcg3ws8Zp - Konstantin Yovkov
重新打开此问题,因为链接的线程没有回答这些最终变量中有多少被复制。 - Thilo
1个回答

1
无论如何,都会存储对封装类的引用。
如果您在内部类中实际引用了它们,则最终变量将作为副本存储。这并不需要任何额外的“分析”,但可以在正常的编译步骤中完成(编译器必须解析变量,因此它也可以输出设置副本的代码)。

好的,我只是在陈述这个观点而没有任何参考。或许有人可以提供一个字节码转储来演示一个最小编译类。 - Thilo
这里有一个这样的转储,但它并没有回答关于不需要的变量的部分:https://dev59.com/2HE85IYBdhLWcg3wYSZk#2804940 - Thilo
3
使用一个存储所有本地变量的编译器很可能仍然符合规范。换句话说,讨论的行为原则上取决于实现。实际上,你是100%正确的,因为没有理智的编译器会特意存储超过必要数量的变量。 - Marko Topolnik
希望如此。特别是因为通常的良好实践是使每个变量和参数都是final,除非必须修改它,否则这将在此处添加一个令人讨厌的隐藏开销。 - Thilo
1
请注意,使用Java 8时,捕获的变量根本不需要是final。因此,局部类可以潜在地捕获所有有效的final变量。 - Marko Topolnik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接