Java匿名内部类
匿名内部类的实例是存储所有可访问的最终变量,还是只存储所述内部类中正在使用的变量?(即,它是否执行某种类型的分析?据我所知,无论发生什么情况,都会存储对父实例的引用。)无论发生什么情况,都会存储对封闭类的引用Java匿名内部类,java,closures,inner-classes,anonymous-class,Java,Closures,Inner Classes,Anonymous Class,匿名内部类的实例是存储所有可访问的最终变量,还是只存储所述内部类中正在使用的变量?(即,它是否执行某种类型的分析?据我所知,无论发生什么情况,都会存储对父实例的引用。)无论发生什么情况,都会存储对封闭类的引用 最终变量存储为副本,但仅当您在内部类中的某个位置实际引用它们时。这实际上不需要任何额外的“分析”,但可以在正常的编译步骤中完成(编译器必须解析变量,这样它也可以输出代码来设置副本).我相信这个线程会有帮助:重新打开,因为链接的线程没有回答这些最终变量中有多少被复制的问题。好的,我只是在陈述
最终变量存储为副本,但仅当您在内部类中的某个位置实际引用它们时。这实际上不需要任何额外的“分析”,但可以在正常的编译步骤中完成(编译器必须解析变量,这样它也可以输出代码来设置副本).我相信这个线程会有帮助:重新打开,因为链接的线程没有回答这些最终变量中有多少被复制的问题。好的,我只是在陈述这一点,没有任何参考。也许有人可以为一个最小的编译类填充一个字节码转储来演示。这里有一个这样的转储,但它没有回答关于不需要的变量的部分:很可能一个存储了所有本地变量的编译器仍然符合规范。换句话说,所讨论的行为原则上依赖于实现。在实践中,你是100%正确的,因为没有一个理智的编译器会特意去存储超出需要的内容。人们希望如此。特别是,除非必须修改,否则将每个变量和参数都设置为final是一种常见的良好做法,这会增加隐藏的开销。因此,本地类可以潜在地捕获所有有效的最终变量。