是否有可能在Java中找到非原始变量的地址?

时间:2012-01-06 21:20:27

标签: java object

如果Integer i = 88,内存地址i位于什么位置?

此外,如果作为调试器的一部分,id号码更改,是否表示创建了新对象?

enter image description here

3 个答案:

答案 0 :(得分:6)

为什么需要Java中任何对象的内存地址?你只能说Integer实例位于堆中。你找不到确切的地址。

第二个问题:是的,Integer个对象是不可变的,所以当Integer类型的变量的值发生变化时,它意味着它指向Integer的不同实例。但是,这并不一定意味着创建的新实例。 new Integer(42)始终创建一个新实例,而Integer.valueOf(42)每次调用时都会创建相同的实例。

答案 1 :(得分:2)

你的第二个问题的答案是肯定的,你在Eclipse的调试器中看到的“id”唯一地标识了一个对象,因此它的变化意味着创建了一个新对象。所以,例如:

Integer i = 55;
Integer j = new Integer(55);
Integer k = Integer.valueOf(55);

这里我和k将具有相同的id,因为它们引用相同的对象; j会有所不同。

其中一个对象的内存地址实际上并不是一个有用的信息,因为对象在内存中移动。你可以知道的是,如果i == k,它们就是同一个对象。 (所以在这里,我= = k但是我!= j)。

答案 2 :(得分:0)

除非你有一个非常接近JVM开发团队的人,否则你无法找到参考变量中存储的数据/地址类型:)。我们所需要的只是访问驻留在该引用中的对象并操纵/执行它。

我不确定你问题的第二部分。另外,我无法确认ID(在调试器中)是否引用了Java堆内存位置。