未初始化的字段会占用内存吗?

时间:2013-02-16 17:47:05

标签: java memory memory-management

我知道只要字段存在就会粘贴到对象上,因此它们会分配一些内存,但是如果我不初始化某些字段而不使用它们会怎么样?例如:

public class TEST {
   public static void main(String[] args) {
      Foo C = new Foo(5, 7);
      Foo D = new Foo(5);
      ...
}

public class Foo{
   private int A;
   private float B;

   public Foo (int A, float B){
      this.A = A;
      this.B = B;
    }
    public Foo (int A){
        this.A = A;
    }
    ...
}

C会消耗比D更多的内存吗?

4 个答案:

答案 0 :(得分:7)

Java中的字段始终已初始化。基元初始化为0或false,引用(和数组)初始化为null

此外,一旦声明了一个字段,该字段将始终占用每个实例中的相同空间。引用只占用与指针一样多的空间,但引用的对象可能需要额外的内存。

答案 1 :(得分:1)

您没有初始化构造函数中的字段这一事实并不意味着它们未初始化。

使用new运算符创建类的实例时,会创建对象并为新创建的实例分配内存,并为该类的所有实例字段及其所有超类分配内存,它们是使用默认值初始化。

所有这些都发生在之后甚至会调用你的构造函数。所以,是的,在这种情况下,CD都将分配相同的内存。

现在考虑一下这样的情况:你的字段不是原始字段,而是对其他实例的引用(Say,Integer而不是int)。在这种情况下,Integer的默认值为null。如果您为一个引用C而不是D初始化它,那么C引用将具有更多内存(为参考字段创建的实例的额外内存将在那里)。

答案 2 :(得分:1)

首先,对风格进行简单的评论。代码看起来像Java。所以所有变量都应该是小写的。然后,对于您的问题,在您的示例中,对象C和D消耗相同的内存量。

字段是原始类型,堆上的一个Foo对象将占用4个字节用于int,另外4个字节用于float。即使您没有初始化它们,它们也将采用默认值(由编译器设置)。

要深入钻取,Foo对象将在32位JVM上精确消耗16个字节。

标头的8个字节(对象id,类对象的引用,锁等)和字段的8个字节(int和float)。

有关详细信息,请参阅this nice article

答案 3 :(得分:0)

new分配内存。 Sizeof(Foo)是常量,因为它只由原始类型组成。

如果你在类型为对象的Foo中添加一些属性,那么如果你分配它们,消耗的大小会发生变化。

public class Foo{
   private int A;
   private float B;
   private Date  C;

   public Foo (int A, float B){
      this.A = A;
      this.B = B;
      this.C = new Date();
    }
    public Foo (int A){
        this.A = A;
    }
    ...
}

public class TEST {
   public static void main(String[] args) {
      Foo C = new Foo(5, 7);
      Foo D = new Foo(5);
      ...
   }
}

在这种情况下,D消耗的内存少于C。