Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 方法中的局部最终变量存储在哪里(堆栈/堆)?_Java_Oop_Memory_Final - Fatal编程技术网

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这两者之间有什么区别?如果你详细说明或张贴一个答案,这将是有帮助的