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

Bha*_*odi 7 java memory oop final

我知道方法变量存储在内存的堆栈上但稍有混淆final.我曾浏览像许多环节无法得到正确的认识?下面是的例子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
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:刚才开始知道隐藏的字段叫做synthetic field(inner class heap memory area),其中存储了最终变量的副本,所以它最终意味着最终的变量存储在最后Stack memory Area

Sai*_*aif 13

通过阅读SO和文章的一些答案,我的理解是:

答案是堆栈.当方法执行结束时,所有局部变量(final或not)都存储到堆栈中并超出范围.

但是关于最终变量JVM将这些作为常量,因为它们在启动后不会改变.当内部类尝试访问它们时,编译器会将该变量的副本(不是它自己的变量)创建到堆中,并在内部类中创建一个合成字段,因此即使方法执行结束,也可以访问它,因为内部类有自己的副本.

so does it finally means that final variables are stored in finally Stack memory Area?

final变量也存储在堆栈中,但是复制了内部类存储在堆中的变量.


合成字段是在源代码中实际存在的,但编译器在某些内部类中创建这些字段以使这些字段可访问.在简单的单词隐藏领域.

参考文献:

如何将变量标记为最终允许内部类访问它们?

不能引用在不同方法中定义的内部类中的非final变量

局部内部类的可访问性之谜

  • 注意:在java-8中.字段可以*有效最终*而不是*显式最终*. (2认同)