Java 方法中的局部最终变量存储在哪里(堆栈/堆)?
我知道方法变量存储在内存堆栈上,但对Java 方法中的局部最终变量存储在哪里(堆栈/堆)?,java,oop,memory,final,Java,Oop,Memory,Final,我知道方法变量存储在内存堆栈上,但对final有点混淆。我浏览了很多链接,比如不能得到正确的理解?下面是内部类的示例,其中最终变量被访问,而本地非最终变量不是存储在堆栈 class Employee { public void getAddress(){ final int location = 13; int notFinalVar = 13; class Address { System.out.println (location); Syste
final
有点混淆。我浏览了很多链接,比如不能得到正确的理解?下面是内部类
的示例,其中最终
变量被访问,而本地非最终
变量不是存储在堆栈
class Employee {
public void getAddress(){
final int location = 13;
int notFinalVar = 13;
class Address {
System.out.println (location);
System.out.println (notFinalVar); // compiler error
}
}
更新:刚刚开始了解名为
合成字段
(内部类堆内存区
)的隐藏字段,其中存储了最终变量的副本,那么它最终是否意味着最终变量存储在最终堆栈内存区
?阅读so和文章的一些答案,我的理解是:
答案是堆叠。所有局部变量(final或not)都存储在堆栈中,并在方法执行结束时超出范围
但关于最后一个变量,JVM将它们作为常量,因为它们在启动后不会改变。当一个内部类试图访问它们时,编译器会将该变量(不是该变量本身)的一个副本创建到堆中,并在内部类中创建一个合成字段,这样即使在方法执行结束时也是如此
它是可访问的,因为内部类有自己的副本
那么它最终是否意味着最终变量存储在最终堆栈内存区域?
final变量也存储在堆栈中,但它是内部类存储在堆中的变量的副本。
合成字段是源代码中实际上不存在的字段,但编译器在一些内部类中创建这些字段以使这些字段可访问。在简单的单词隐藏字段中 参考资料:
是的:正是因为这个副本,java要求您将这些变量声明为最终变量。您能否详细说明Inner类中的“合成合成字段”合成合成字段是一个打字错误,它是
合成字段
。我在java-8中更新了我的答案@BhargavModiNote:。。一个字段可以是有效的最终字段,而不是显式的最终字段。@Lostmind这两者之间有什么区别?如果你详细说明或张贴一个答案,这将是有帮助的