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变量也存储在堆栈中,但是复制了内部类存储在堆中的变量.
合成字段是在源代码中实际存在的,但编译器在某些内部类中创建这些字段以使这些字段可访问.在简单的单词隐藏领域.
参考文献: