Java将最终成员和静态成员存储在哪里?

4
我知道类的静态方法和非静态方法都存储在方法区。
但我真的很怀疑Java将对象的final变量(常量)成员和静态变量成员存储在哪里。
例如,
class A{
     private final int a = 1;
     private static int b = 2;
     private static final int c = 3;
     //other codes...
}

我想知道Java把a、b、c存储在内存的哪个位置。堆、栈还是方法区?


======更新=====
嘿,谢谢你的帮助。请允许我分享一个关于JVM组件的链接:http://www.artima.com/insidejvm/ed2/jvm2.html


1
可能是 https://dev59.com/52oy5IYBdhLWcg3wsP_Q 的重复问题。 - Rohan
@almasshaikh 是的。但是我在谷歌上找到的大部分材料只是告诉我在哪里存储本地 final 变量。例如,这个[https://dev59.com/iFfUa4cB1Zd3GeqPDwfX]。 - aMooly
@vikeng21 感谢您的评论,也许可以点击此链接参考:http://www.artima.com/insidejvm/ed2/jvm2.html - aMooly
@RRR 感谢您的评论。但我也在想最终成员的存储方式。 - aMooly
2个回答

0

在我的测试中,我得出了这个结论。

   1. private final int a = 1; // heap with object
   2. private static int b = 2; // class variables of Method Area
   3. private static final int c = 3; // run-time constant pool of Method Area
  1. final int 是在构造函数中创建的,这意味着它与对象相关。
  2. static int 是在 static {} 中创建的,这意味着它与静态变量相关, 静态变量等同于方法区的类变量。
  3. static final int 存储在常量池中,没有相关的代码。这意味着它将在运行时被引用。

字节码分析


0
在Java虚拟机实例内,有关已加载类型的信息存储在称为“方法区”的逻辑内存区域中。类中声明的类(静态)变量的内存来自方法区。
所有实例变量都将存储在堆区域中,包括final成员。

1
谢谢你的回答。那最终成员的存储呢? - aMooly
即使它是最终变量,它仍然是实例变量。因此,它将与对象数据一起存储在堆区域中。 - Sagar Pudi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接