我正在读一本书“Thinking in Java”,书中写道 对象存储在堆上,静态变量存储在某个固定位置,称为静态存储,这样它们在程序运行时可供整个时间程序使用。
class Myclass{
static int x =0; //stored on static storage
Myclass obj = new Myclass(); //stored on heap
}
虽然创建一个对象,但就 OOP 而言,
static
并不是一个好主意。暂时搁置这个问题,我的问题来了:
class Myclass { static Myclass obj = new Myclass(); //no man's land }
所有静态内容将在类加载/启动上创建并存储在特殊位置(很可能是永久代的一部分,根据实现而有所不同)。
对于第二个示例,当加载您的
Myclass
时,将创建/实例化它的静态内容。
这个教程可以为您提供高层次的概述。
静态是程序的特殊内存位置。所以程序可以轻松访问它。只有一个这样的位置可供程序运行。这是创建静态内容的地方。 JVM 在堆上实例化对象。但是,如果您对该对象进行静态引用,那么它将放置在静态内存位置。
静态变量存储在方法区域。
方法区是非堆内存的一部分。它存储每个类的结构、方法和构造函数的代码。每个类的结构意味着运行时常量和静态字段。
这取决于 JVM 的实现。在您的示例中,变量被初始化为原始值,因此它将存储在元空间(本机内存,堆外)中。如果您使用
new ObjectClassSmthng()
初始化它,该对象将存储在堆上,而 x
变量(这是一个引用)将存储在元空间中。
HotSpot JDK 8 也是如此。