在 Java 中,被 static 关键字修饰的内容,包括静态变量和静态方法,是与类本身相关联的,而不是与类的实例相关联。这些静态成员会被存放在 JVM 的方法区中。
静态成员的存储位置
-
静态变量(类变量):
- 静态变量在类加载时分配内存,并存储在方法区(Method Area)中。
- 这些变量在所有实例之间共享,并且在类的所有实例中只有一个拷贝。
-
静态方法:
- 静态方法也是存储在方法区中。
- 它们属于类本身,而不是类的实例,因此可以通过类名直接调用,而不需要创建类的实例。
JVM 内存结构
为了更好地理解静态成员的存储位置,以下是 JVM 的内存结构概述:
-
方法区(Method Area):
- 方法区是 JVM 内存的一部分,用于存储已加载的类信息、常量、静态变量、即时编译器编译后的代码等。
- 静态变量和静态方法存储在这里。
- 方法区在 JVM 的规范中也被称为永久代(PermGen),在 Java 8 之后,改为了元空间(Metaspace)。
-
堆(Heap):
- 堆是 JVM 内存中最大的区域,用于存储所有对象实例和数组。
- 实例变量存储在对象中,对象存储在堆中。
-
栈(Stack):
- 每个线程都有自己的栈帧,用于存储局部变量、方法调用链等。
- 方法中的局部变量和参数存储在栈中。
-
程序计数器(PC Register):
- 每个线程都有一个程序计数器,用于存储当前线程执行的字节码指令的地址。
-
本地方法栈(Native Method Stack):
- 用于执行本地(Native)方法的栈。
示例
以下示例展示了静态变量和静态方法的使用:
public class MyClass {
// 静态变量
public static int staticVar = 42;
// 静态方法
public static void staticMethod() {
System.out.println("Static method called");
}
public static void main(String[] args) {
// 访问静态变量
System.out.println(MyClass.staticVar);
// 调用静态方法
MyClass.staticMethod();
}
}
在这个示例中:
staticVar是一个静态变量,存储在方法区中,并且在类加载时初始化。staticMethod是一个静态方法,也存储在方法区中,可以通过类名直接调用。
总结
被 static 修饰的内容,包括静态变量和静态方法,存储在 JVM 的方法区中。方法区用于存储类信息、常量、静态变量、静态方法等,与类实例无关,因此这些静态成员在所有实例之间共享,并在类加载时初始化。



9315

被折叠的 条评论
为什么被折叠?



