我知道只要字段存在就会粘贴到对象上,因此它们会分配一些内存,但是如果我不初始化某些字段而不使用它们会怎么样?例如:
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
更多的内存吗?
答案 0 :(得分:7)
Java中的字段始终已初始化。基元初始化为0或false
,引用(和数组)初始化为null
。
此外,一旦声明了一个字段,该字段将始终占用每个实例中的相同空间。引用只占用与指针一样多的空间,但引用的对象可能需要额外的内存。
答案 1 :(得分:1)
您没有初始化构造函数中的字段这一事实并不意味着它们未初始化。
使用new
运算符创建类的实例时,会创建对象并为新创建的实例分配内存,并为该类的所有实例字段及其所有超类分配内存,它们是使用默认值初始化。
所有这些都发生在之后甚至会调用你的构造函数。所以,是的,在这种情况下,C
和D
都将分配相同的内存。
现在考虑一下这样的情况:你的字段不是原始字段,而是对其他实例的引用(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。