关于java的null

来源:百度知道 编辑:UC知道 时间:2024/06/03 16:08:13
比如a=null;

以下说法哪种正确?
1)a在栈里 其引用的一段内存空间处于堆中,但是这段内存空间虽然是存在着的,但是里面没有存储任何内容。

2)a在栈里,其没有引用堆中的任何内存空间,即a本身就是一个null

一知半解的人闪开 对知识掌握谨慎、严格、准确的人来帮忙解答

首先java对象的产生是分两步的:
1.在栈区声明对象 如A a,这时声明的内容相当于一个指针(我们姑且认为它是一个指针,也可以理解为引用),当a=null时表明这是一个没有指向任何对象.
2.实例化a,操作如下a=new A()这是在堆区为a分配了空间.

也就是由栈区的a指向堆区的new A()对象.

而a=null则是表明,首先,a是必然在栈区的,a的值是一个地址(假设它真的是一个指针),a=null表示的是a的值是null,与堆区无关

此时的a与堆并无关系,何况java中有一种申请垃圾回收的手段便是将一个对象赋值为null以切断与之前关联对象的关系,因此答案应该是2.

a在栈里,其没有引用堆中的任何内存空间,即a本身就是一个null
这个正确。

准确来说a只是一个引用,他其实相当于C里的指针。

a这个引用也是一个变量,它在栈里。这个变量可以保存的内容是一个地址,这个地址表示了堆空间中的一个起始地址。当a被赋值后,a里放的就是它指的那个对象的地址。

所以,a如果为null的话,准确说它是没有在堆里分配空间的。
就如2楼所说,没有意义。

2

第二个 正确。对于 要是分配内存的话,需要new 生成。

明显是2正确

1 相当于 声明并赋值了

2只是声明了 所以本身是null

在我所知的虚拟机实现里都是2,
如果用1的话,真想不出来它的垃圾回收是怎么做的。