Java中初始化变量的内存分配

时间:2014-02-27 10:17:31

标签: java memory-management

这种混淆了我,我很不确定这在Java中是如何运作的。

让我们说我们有这两个变量:

String a = "Hello World";
String b;

很明显,a堆栈中占用了一点空间,并指向堆>中的值“Hello World” STRONG>。但b的情况如何呢?

它是否只在堆栈中创建该引用并在堆中指向哪里?我假设其值目前为null

2 个答案:

答案 0 :(得分:1)

是的,你是正确的,两者都会在堆栈中创建一个本地指针,指向堆中的地址。在 a 的情况下,它将指向在堆中分配的某个地址,如果 b 它指向 null ,在Java中,它是特殊类型,指定无效指针。您可以在此处详细了解 null What is null in Java?

此外,像<< strong> int long 等基本类型...通常都有默认值,并且它们不是自己引用的,因为字符串是一个对象,您实际上在堆栈中创建一个引用并将其设置为堆上的某个位置或 null

答案 1 :(得分:1)

严格地说,如果你有一个非平凡的未使用的局部变量,编译器很可能会被优化,甚至永远不会将引用放在堆栈上。否则,在不明显的情况下,它可能指向null。但是,这是Java的做事方式。这个堆上发生的问题是一个设计选择,并详细讨论here

在C-world中,在预处理阶段,预处理器使用诸如“类型”,“引用”,“值”和一些其他数据之类的信息填充“表”。这就是我们如何建立声明和初始化之间的区别。所以,如果我们永远不会将对象指向任何“值”,它就永远不会被初始化......因此,堆就会被孤立。请注意,将某些内容指向null仍在初始化它。