存储方法(Stack / Heap)中的局部最终变量在哪里?

时间:2015-03-24 05:39:12

标签: java oop memory final

我知道方法变量存储在内存的堆栈中,但稍微混淆了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 fieldinner class heap memory area)的隐藏字段,其中存储了最终变量的副本,因此它最终意味着最终变量是存储在finally Stack memory Area

1 个答案:

答案 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

Mystery of Accessibility in Local Inner Classes