静态变量内存分配

时间:2014-10-07 08:20:59

标签: java memory-management static

class A            // Normal Class
{  
  static int i;    // Static int variable  
  int j;           // Normal int variable  
}  

假设我创建了两个对象,即A1A2 两个对象是否为变量i或公共的Permgen空间

分配了单独的内存

A1A2的大小是多少?假设假设int的大小为2个字节。

5 个答案:

答案 0 :(得分:6)

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

对于对象的大小,它们是size of the object minus the static member variables

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

答案 1 :(得分:3)

  

两个对象是否都为变量i分配了单独的内存?

静态成员属于类(而非实例)级别。因此,只有一个int ij位于实例级别,因此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;