这种混淆了我,我很不确定这在Java中是如何运作的。
让我们说我们有这两个变量:
String a = "Hello World";
String b;
很明显,a
在堆栈中占用了一点空间,并指向堆>>中的值“Hello World” STRONG>。但b
的情况如何呢?
它是否只在堆栈中创建该引用并在堆中指向哪里?我假设其值目前为null
。
答案 0 :(得分:1)
是的,你是正确的,两者都会在堆栈中创建一个本地指针,指向堆中的地址。在 a 的情况下,它将指向在堆中分配的某个地址,如果 b 它指向 null ,在Java中,它是特殊类型,指定无效指针。您可以在此处详细了解 null :What is null in Java?
此外,像<< strong> int , long 等基本类型...通常都有默认值,并且它们不是自己引用的,因为字符串是一个对象,您实际上在堆栈中创建一个引用并将其设置为堆上的某个位置或 null 。
答案 1 :(得分:1)
严格地说,如果你有一个非平凡的未使用的局部变量,编译器很可能会被优化,甚至永远不会将引用放在堆栈上。否则,在不明显的情况下,它可能指向null。但是,这是Java的做事方式。这个堆上发生的问题是一个设计选择,并详细讨论here。
在C-world中,在预处理阶段,预处理器使用诸如“类型”,“引用”,“值”和一些其他数据之类的信息填充“表”。这就是我们如何建立声明和初始化之间的区别。所以,如果我们永远不会将对象指向任何“值”,它就永远不会被初始化......因此,堆就会被孤立。请注意,将某些内容指向null仍在初始化它。