class A // Normal Class
{
static int i; // Static int variable
int j; // Normal int variable
}
假设我创建了两个对象,即A1
,A2
。
做两个对象单独的内存为变量i
或公共,PermGen的空间分配静态变量内存分配
会是什么A1
,A2
大小?假设假设int
的大小为2个字节。
class A // Normal Class
{
static int i; // Static int variable
int j; // Normal int variable
}
假设我创建了两个对象,即A1
,A2
。
做两个对象单独的内存为变量i
或公共,PermGen的空间分配静态变量内存分配
会是什么A1
,A2
大小?假设假设int
的大小为2个字节。
相同的内存,static
成员变量在实例之间共享,因为static
是class level,它们都是相同的类。
至于对象的大小,他们将size of the object minus the static member variables。
此外
static
有一个小写的',而不是大写。关键字区分大小写。int
是4 bytes,而不是2是否两个物体已经单独存储为变量i分配?
静态成员处于类(而非实例)级别。所以,只会有一个int i
。 j
处于实例级别,因此A的每个实例都将包含一个j
。
所以,你的问题是一种无效。为什么? 因为静态有类的实例无关(像马尔科Toplonik说)
instanceOfA.i
实际上将被解析为A.i
静态实例,在类模板内部声明。编译器只将该类加载到内存一次,并使用此模板编译器创建字节代码。 JVM通过使用此类模板创建对象,并且不会加载越来越多的相同类模板来创建越来越多的对象。因此静态实例只声明一次。同一类的每个对象都访问相同的静态实例。
祝你好运!!!
*编译器*不执行*加载*类和创建对象的任务。 JVM这样做 – TheLostMind 2014-10-07 08:28:42
静态变量在加载类时加载,所以它们被分配一个固定的内存空间,而不管创建的对象的数量如何。
因此,对于所有创建的对象,变量i
的内存保持不变。
您甚至可以在不创建对象的情况下访问静态变量和函数,只需使用类名即可。
class A
{
static int i;
}
A.i=10;
什么是每个实例
对象的尺寸大小只取决于实例成员。
如何证明它?
计算A型的物体的大小和检查什么是版画,然后做同样的,而不在类的静态变量?
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(new A());
System.out.println(baos.size());
它是静态的。它与班级的实例无关。 – 2014-10-07 08:22:42
每个实例的大小是多少?如果int的大小假定为2个字节 – Harsha 2014-10-07 08:25:53
为什么你会假设int的大小为2个字节?由于内存对齐问题,'int'属性至少占用4个字节,可能还有8个字节。 Java对象也具有显着的内存开销,并且一个新的Object()在64位HotSpot上花费24个字节。 – 2014-10-07 08:32:15