进一步解释我的问题。只需编写 String foo;
即可分配内存。还是只有在第一次给变量赋值时才预留内存?谢谢。
最佳答案
我将以不同的方式回答这个问题,因为我认为链接的(重复的)答案是错误的。
内存IS在您声明引用时分配。
public MyClass {
public String s;
}
该引用s
堆上需要 8 个字节(通常是大多数 JVM)。内存必须在那里。
现在,当您分配它时,会分配更多内存。
public static void main( String args... ) {
MyClass c = new MyClass();
c.s = new String("Hello Memory");
}
字符串"Hello Memory"
也占用内存,但引用s
仍然占用堆上的 8 个字节,并且是 MyClass
时分配的内存的一部分。被创建。此外,所有 Java 对象在堆上都有大约 8 个字节的额外开销(所有 Java 对象都有一个与其关联的监视器,因此需要开销)。
并且在方法main
中, c
除了 new
占用的内存外,还占用 8 个字节(在堆栈上)。需要在堆上分配。我真的认为如果你想了解内存是如何工作的,你需要考虑这种分配。
我可能会把这个搞砸,因为内存分配变得很棘手,但这个程序是如何分配内存的,从 main
开始.
第一c
当 main
时分配被调用:8字节。
然后new MyClass()
在堆上分配 16 个字节(s
的大小 + 8 个字节的开销)。
接下来,(你准备好了吗?)new String("Hello Memory");
在堆上分配 48 个字节。为什么? Java 字符串声明如下:
public final String {
private final char[] string;
private int hashcode;
}
因此字符串对象需要 8 个字节的开销,加上数组的 12 个字节的开销(数组是对象,也需要数组的长度,所以正常的 8 个字节的开销 + 4 个字节的长度)。 hashcode
字段另外占用 4 个字节,字符串数据“Hello Memory”占用 24 个字节(12 chars
每个 2 个字节)。如果我这样做正确的话,它加起来将达到 48 个字节。 C 程序员要么笑,要么哭。
关于java - 声明但不初始化对象是否分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43815698/