我知道方法变量存储在内存的堆栈中,但稍微混淆了final
。我浏览了许多像this这样的链接无法正确理解?以下是inner class
的示例,其中final
个变量被访问,而本地non-final
变量并未存储在stack
class Employee {
public void getAddress(){
final int location = 13;
int notFinalVar = 13;
class Address {
System.out.println (location);
System.out.println (notFinalVar); // compiler error
}
}
更新:刚才开始了解名为synthetic field
(inner class heap memory area
)的隐藏字段,其中存储了最终变量的副本,因此它最终意味着最终变量是存储在finally Stack memory Area
?
答案 0 :(得分:13)
阅读SO和文章的一些答案,我的理解是:
答案是堆叠。当方法执行结束时,所有局部变量(final或not)都存储到堆栈中并超出范围。
但是关于最终变量JVM将这些作为常量,因为它们在启动后不会改变。当内部类尝试访问它们时,编译器会将该变量的副本(不是它自己的变量)创建到堆中,并在内部类中创建一个合成字段,这样即使方法执行结束也是如此 它是可访问的,因为内部类有自己的副本。
so does it finally means that final variables are stored in finally Stack memory Area?
最终变量也存储在堆栈中,但是内部类存储在堆中的变量副本。
合成字段,它实际上并不存在于源代码中,但编译器会在某些内部类中创建这些字段以使这些字段可访问。在简单的单词隐藏领域。
参考文献:
How does marking a variable as final allow inner classes to access them?
Cannot refer to a non-final variable inside an inner class defined in a different method