静态成员变量是在Java中用关键字"static"声明的变量,它们属于类而不是类的实例。在Java中,静态成员变量是存储在特殊的内存区域中,称为"方法区"或者"永久代"(在Java 8之前的版本),而不是存储在堆内存或栈内存中。
下面我们通过源代码来说明静态成员变量的存储位置:
public class StaticVariableExample {
public static int staticVariable;
public int instanceVariable;
public static void main(String[] args) {
StaticVariableExample obj1 = new StaticVariableExample();
StaticVariableExample obj2 = new StaticVariableExample();
// 修改静态成员变量的值
obj1.staticVariable = 10;
System.out.println("obj1.staticVariable = " + obj1.staticVariable); // 输出:obj1.staticVariable = 10
System.out.println("obj2.staticVariable = " + obj2.staticVariable); // 输出:obj2.staticVariable = 10
// 修改实例变量的值
obj1.instanceVariable = 20;
System.out.println("obj1.instanceVariable = " + obj1.instanceVariable); // 输出:obj1.instanceVariable = 20
System.out.println("obj2.instanceVariable = " + obj2.instanceVariable); // 输出:obj2.instanceVariable = 0
}
}
在上面的代码中,我们定义了一个名为StaticVariableExample
的类,其中包含一个静态成员变量staticVariable
和一个实例变量instanceVariable
。
在main
方法中,我们创建了两个类的实例obj1
和obj2
。然后,我们使用obj1
来修改静态成员变量staticVariable
的值,并打印出obj1.staticVariable
和obj2.staticVariable
的值。由于静态成员变量属于类,因此无论我们通过哪个实例来修改它,它的值对所有实例都是可见的。因此,obj2.staticVariable
的值也会被修改为10。
接下来,我们使用obj1
来修改实例变量instanceVariable
的值,并打印出obj1.instanceVariable
和obj2.instanceVariable
的值。由于实例变量是每个实例独有的,因此对obj1
的修改不会影响到obj2
。因此,obj2.instanceVariable
的值仍然是默认值0。
从上面的例子中可以看出,静态成员变量是存储在方法区(或者永久代)中的,而实例变量是存储在堆内存中的。方法区是所有的类共享的存储区域,它包含了类的信息、静态变量、常量池等。而堆内存用于存储类的实例和实例变量。
总结一下,Java中的静态成员变量是存储在方法区(或者永久代)中的,而不是存储在堆内存或栈内存中。这使得静态成员变量可以被类的所有实例共享,并且可以在没有创建类实例的情况下访问。