我刚刚开始学习Java,我想问你一个关于Integer对象的问题。
例如我们有:
Integer i = new Integer(15);
如果输入System.out.println(i),为什么我看不到内存地址?
我知道如果我想查看任何对象的内存地址,我输入SOP(obj),我看到一个内存地址,如projectname.classname@4141d797,这是存储在堆栈中,因为对于引用类型,堆栈保持不变指向堆上对象的指针。
我发现这对Integer对象不起作用。如果我输入S.O.P(i)我收到15。
为什么在这种情况下堆栈不会将内存地址保存到堆上的对象?
提前致谢!
答案 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--