JVM如何处理静态变量?
class A{ static int a=5; int b=6; void method(){ //method body a++; } }
JVM如何处理静态变量处理静态变量。 例如…
A object1=new A(); A object2=new A();
上面的代码将在两个不同的内存位置创建两个A类对象。 还将创建variable b
两个实例。 variable a
会发生什么。 哪个对象将保存静态变量的引用? 以及更新静态变量时会发生什么?
“哪个对象将保存静态变量的引用”
对象不包含静态变量,因为它们未绑定到任何对象,它们绑定到类。 应用于类(而不是实例数据)的类和所有数据都存储在堆的“永久生成”部分中。
https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html
只有一个变量a
副本,它在A
类A
所有实例之间共享。
静态成员变量是类变量。 它们不存在于类的任何实例(对象)中 – 因此没有包含变量的A
对象。
请参阅Oracle的Java教程: 了解类成员
静态变量与不在实例中的类相关,因此A的两个实例将共享静态变量。
另一个例子,如果你需要同步(使用synchronized)来访问静态变量,你必须记住锁是静态的,所以锁与所有实例共享。
直截了当的回答
“存储在类的上下文中的所有静态数据(全局内存)和存储在Object作用域内存中的所有对象数据,如实例变量(特定于每个对象 – 自己的副本)”
对静态变量的更改将反映到所有对象bcz它是一个全局内存,并且对实例变量的更改特定于对象级别
一个object1 = new A(); a = 5 b = 6
一个object2 = new A(); a = 5 b = 6
object1.method(); a = 6 b = 6
object2.method(); a = 7 b = 6