方法中的局部最终变量存储在哪里(Stack/Heap)?
Where is the local final variable in method stored (Stack/Heap)?
我知道方法变量存储在内存的堆栈中,但对 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
}
}
Update:刚刚知道了名为 synthetic field
(inner class heap memory area
) 的隐藏字段,其中存储了 final 变量的副本,所以 finally意味着最终变量存储在 finally Stack memory Area
?
看了一些SO和文章的回答,我的理解是:
答案是堆栈。当方法执行结束时,所有局部变量(final 或非 final)都存储在堆栈中并超出范围。
但是关于最终变量,JVM 将它们视为常量,因为它们在启动后不会改变。当内部 class 尝试访问它们时,编译器会将该变量(不是变量本身)的副本创建到堆中,并在内部 class 内部创建一个合成字段,因此即使方法执行是超过
它是可访问的,因为内部 class 有自己的副本。
so does it finally means that final variables are stored in finally Stack memory Area?
最终变量也存储在堆栈中,但内部class存储在堆中的变量的副本。
合成字段 被归档,实际上在源代码中不存在,但编译器在一些内部 classes 中创建这些字段以使这些字段可访问。在简单的单词隐藏字段中。
参考资料:
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
我知道方法变量存储在内存的堆栈中,但对 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
}
}
Update:刚刚知道了名为 synthetic field
(inner class heap memory area
) 的隐藏字段,其中存储了 final 变量的副本,所以 finally意味着最终变量存储在 finally Stack memory Area
?
看了一些SO和文章的回答,我的理解是:
答案是堆栈。当方法执行结束时,所有局部变量(final 或非 final)都存储在堆栈中并超出范围。
但是关于最终变量,JVM 将它们视为常量,因为它们在启动后不会改变。当内部 class 尝试访问它们时,编译器会将该变量(不是变量本身)的副本创建到堆中,并在内部 class 内部创建一个合成字段,因此即使方法执行是超过 它是可访问的,因为内部 class 有自己的副本。
so does it finally means that final variables are stored in finally Stack memory Area?
最终变量也存储在堆栈中,但内部class存储在堆中的变量的副本。
合成字段 被归档,实际上在源代码中不存在,但编译器在一些内部 classes 中创建这些字段以使这些字段可访问。在简单的单词隐藏字段中。
参考资料:
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