Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java匿名内部类_Java_Closures_Inner Classes_Anonymous Class - Fatal编程技术网

Java匿名内部类

Java匿名内部类,java,closures,inner-classes,anonymous-class,Java,Closures,Inner Classes,Anonymous Class,匿名内部类的实例是存储所有可访问的最终变量,还是只存储所述内部类中正在使用的变量?(即,它是否执行某种类型的分析?据我所知,无论发生什么情况,都会存储对父实例的引用。)无论发生什么情况,都会存储对封闭类的引用 最终变量存储为副本,但仅当您在内部类中的某个位置实际引用它们时。这实际上不需要任何额外的“分析”,但可以在正常的编译步骤中完成(编译器必须解析变量,这样它也可以输出代码来设置副本).我相信这个线程会有帮助:重新打开,因为链接的线程没有回答这些最终变量中有多少被复制的问题。好的,我只是在陈述

匿名内部类的实例是存储所有可访问的最终变量,还是只存储所述内部类中正在使用的变量?(即,它是否执行某种类型的分析?据我所知,无论发生什么情况,都会存储对父实例的引用。)

无论发生什么情况,都会存储对封闭类的引用


最终变量存储为副本,但仅当您在内部类中的某个位置实际引用它们时。这实际上不需要任何额外的“分析”,但可以在正常的编译步骤中完成(编译器必须解析变量,这样它也可以输出代码来设置副本).

我相信这个线程会有帮助:重新打开,因为链接的线程没有回答这些最终变量中有多少被复制的问题。好的,我只是在陈述这一点,没有任何参考。也许有人可以为一个最小的编译类填充一个字节码转储来演示。这里有一个这样的转储,但它没有回答关于不需要的变量的部分:很可能一个存储了所有本地变量的编译器仍然符合规范。换句话说,所讨论的行为原则上依赖于实现。在实践中,你是100%正确的,因为没有一个理智的编译器会特意去存储超出需要的内容。人们希望如此。特别是,除非必须修改,否则将每个变量和参数都设置为final是一种常见的良好做法,这会增加隐藏的开销。因此,本地类可以潜在地捕获所有有效的最终变量。