Integer对象的内存地址

时间:2018-03-29 10:22:00

标签: java memory integer stack heap-memory

我刚刚开始学习Java,我想问你一个关于Integer对象的问题。

例如我们有:

 Integer i = new Integer(15);

如果输入System.out.println(i),为什么我看不到内存地址?

我知道如果我想查看任何对象的内存地址,我输入SOP(obj),我看到一个内存地址,如projectname.classname@4141d797,这是存储在堆栈中,因为对于引用类型,堆栈保持不变指向堆上对象的指针。

我发现这对Integer对象不起作用。如果我输入S.O.P(i)我收到15。

为什么在这种情况下堆栈不会将内存地址保存到堆上的对象?

提前致谢!

3 个答案:

答案 0 :(得分:2)

由于Integer会覆盖默认的Object.toString()方法,该方法会为您提供您正在考虑的特定输出。

它甚至不是严格的内存地址,即使当前的实现确实使用地址作为它的基础。然而,对象可以在内存中移动,并且该值不会发生变化,因此您无法从中得出任何结论。

最后,你不应该关心它。您不必担心使用Java存储对象的位置。

答案 1 :(得分:1)

当您尝试使用System.out.println命令打印对象时,实际发生的是对该对象的toString方法的调用。所有对象都隐式扩展了类Object,其toString方法返回您熟悉的输出。

但是在Integer类的情况下,toString被覆盖并返回Integer的值。那是因为如果你打印出一个整数,你很可能只想学习它代表的数字,而不是对象的字符串表示

答案 2 :(得分:0)

您只能看到无法正确实现toString();

的数据类型的内存地址

这些类型继承Object类的默认行为,即:https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#toString--