class A // Normal Class
{
static int i; // Static int variable
int j; // Normal int variable
}
假设我创建了两个对象,即A1
,A2
两个对象是否为变量i
或公共的Permgen空间
A1
,A2
的大小是多少?假设假设int
的大小为2个字节。
答案 0 :(得分:6)
相同的内存,static
成员变量在实例之间共享,因为static
是class level并且它们都属于同一类。
对于对象的大小,它们是size of the object minus the static member variables。
static
有一个小写的's',而不是大写。关键字区分大小写。int
是4 bytes,而不是2 答案 1 :(得分:3)
两个对象是否都为变量i分配了单独的内存?
静态成员属于类(而非实例)级别。因此,只有一个int i
。 j
位于实例级别,因此A的每个实例都会包含j
。
所以,你的问题有点无效。为什么? 因为 static 与类的实例无关(比如 Marko Toplonik 所说的)
instanceOfA.i
实际上将解析为A.i
答案 2 :(得分:1)
每个实例的大小是什么
对象的大小仅取决于实例成员。
如何证明?
计算A类对象的大小并检查打印的内容,然后在A类中没有静态变量的情况下执行相同的操作?
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(new A());
System.out.println(baos.size());
答案 3 :(得分:0)
静态实例在类模板的内部声明。编译器只将类加载到内存中一次,并使用此模板编译器创建字节代码。 JVM通过使用此类模板创建对象,并且不会加载越来越多的相同类模板来创建越来越多的对象。因此静态实例只声明一次。同一个类的每个对象都访问同一个静态实例。
祝你好运!!!
答案 4 :(得分:0)
静态变量在加载类时加载,因此无论创建的对象数是多少,都会为它们分配一个常量的内存空间。
因此,变量i
的内存对于创建的所有对象保持相同。
您甚至可以使用类名来访问静态变量和函数而无需创建对象。
class A
{
static int i;
}
A.i=10;