可以在Java中找到非原语变量的地址吗?

可以在Java中找到非原语变量的地址吗?,java,object,Java,Object,如果整数i=88,则i所在的内存地址是什么 此外,如果作为调试器的一部分,idnumber发生更改,是否表示创建了新对象 为什么您需要Java中任何对象的内存地址?您所能说的就是Integer实例位于堆中。你找不到确切的地址 第二个问题:是的,Integer对象是不可变的,因此当类型为Integer的变量的值更改时,意味着它指向Integer的不同实例。但是,这并不一定意味着创建了一个新实例new Integer(42)总是在Integer时创建一个新实例。valueOf(42)每次调用它时都会

如果
整数i=88
,则
i
所在的内存地址是什么

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


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


第二个问题:是的,
Integer
对象是不可变的,因此当类型为
Integer
的变量的值更改时,意味着它指向
Integer
的不同实例。但是,这并不一定意味着创建了一个新实例
new Integer(42)
总是在
Integer时创建一个新实例。valueOf(42)
每次调用它时都会创建同一个实例。

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

Integer i = 55;
Integer j = new Integer(55);
Integer k = Integer.valueOf(55);
这里i和k将具有相同的id,因为它们引用相同的对象;j将是不同的


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

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


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

除此之外,地址可能会随着时间的推移而变化,因为垃圾回收会移动对象以合并可用空间。我有一个问题,如果不先创建
Integer
,它怎么能指向另一个
Integer
实例呢?
Integer x=42
实际上被转换为
Integer x=Integer.valueOf(42)
——它可以创建新实例或使用缓存的实例。