2014-10-07 89 views
0
class A   // Normal Class 
{ 
    static int i; // Static int variable 
    int j;   // Normal int variable 
} 

假设我创建了两个对象,即A1,A2
做两个对象单独的内存为变量i或公共,PermGen的空间分配静态变量内存分配

会是什么A1A2大小?假设假设int的大小为2个字节。

+3

它是静态的。它与班级的实例无关。 – 2014-10-07 08:22:42

+0

每个实例的大小是多少?如果int的大小假定为2个字节 – Harsha 2014-10-07 08:25:53

+2

为什么你会假设int的大小为2个字节?由于内存对齐问题,'int'属性至少占用4个字节,可能还有8个字节。 Java对象也具有显着的内存开销,并且一个新的Object()在64位HotSpot上花费24个字节。 – 2014-10-07 08:32:15

回答

6

相同的内存,static成员变量在实例之间共享,因为staticclass level,它们都是相同的类。

至于对象的大小,他们将size of the object minus the static member variables

此外

  • static有一个小写的',而不是大写。关键字区分大小写。
  • int4 bytes,而不是2
+0

我想知道var i的大小,添加到实例大小。对象大小只能是(size(i)+ size(j))或(size(j))。 bcoz var i被单独存储 – Harsha 2014-10-07 09:44:49

+0

'i'没有被添加到对象大小,它基本上被视为一个单独的全局变量,只能被该类访问。 – 2014-10-07 09:48:13

+1

谢谢.. Ross Drew – Harsha 2014-10-07 12:56:57

3

是否两个物体已经单独存储为变量i分配?

静态成员处于类(而非实例)级别。所以,只会有一个int ij处于实例级别,因此A的每个实例都将包含一个j

所以,你的问题是一种无效。为什么? 因为静态有类的实例无关(像马尔科Toplonik说)

instanceOfA.i实际上将被解析为A.i

0

静态实例,在类模板内部声明。编译器只将该类加载到内存一次,并使用此模板编译器创建字节代码。 JVM通过使用此类模板创建对象,并且不会加载越来越多的相同类模板来创建越来越多的对象。因此静态实例只声明一次。同一类的每个对象都访问相同的静态实例。

祝你好运!!!

+1

*编译器*不执行*加载*类和创建对象的任务。 JVM这样做 – TheLostMind 2014-10-07 08:28:42

0

静态变量在加载类时加载,所以它们被分配一个固定的内存空间,而不管创建的对象的数量如何。

因此,对于所有创建的对象,变量i的内存保持不变。

您甚至可以在不创建对象的情况下访问静态变量和函数,只需使用类名即可。

class A 
{ 
    static int i; 
} 

A.i=10; 
1

什么是每个实例

对象的尺寸大小只取决于实例成员。

如何证明它?

计算A型的物体的大小和检查什么是版画,然后做同样的,而不在类的静态变量?

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ObjectOutputStream oos = new ObjectOutputStream(baos); 
oos.writeObject(new A()); 

System.out.println(baos.size());