You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Integer对象内存地址无法通过System.out.println输出的疑问

为什么打印Integer对象看不到类似普通对象的内存地址格式?

嘿,刚学Java遇到这个问题太正常了,我当初也纠结过好一会儿!咱们一步步拆解原因:

先搞懂System.out.println(obj)的底层逻辑

当你用System.out.println()打印一个对象时,Java实际上会自动调用这个对象的toString()方法,再把返回的字符串输出到控制台——这是所有对象打印行为的核心逻辑。

普通对象的toString()来自哪里?

如果是你自己定义的类(比如一个Person类),没有手动重写toString()方法,那它会直接继承父类Object的默认实现。这个默认实现的输出格式是:

全类名@对象哈希码的十六进制表示

你看到的projectname.classname@4141d797就是这种格式,这里的十六进制数是对象的哈希码(虽然通常和内存地址强相关,但严格来说不是直接的内存地址)。

Integer类的特殊之处

Integer作为Java提供的基础包装类,它主动重写了Object类的toString()方法!它的重写逻辑非常直白:直接返回自身包装的int数值的字符串形式。比如你创建的new Integer(15),调用它的toString()就会返回字符串"15",所以System.out.println(i)自然就输出15,而不是普通对象的地址格式。

要是真想看到类似普通对象的输出怎么办?

如果好奇Integer对象的“地址格式”输出,可以手动调用Object类的原始toString()方法,比如通过反射实现:

Integer i = new Integer(15);
try {
    Method toStringMethod = Object.class.getDeclaredMethod("toString");
    System.out.println(toStringMethod.invoke(i));
} catch (Exception e) {
    e.printStackTrace();
}

或者你也可以自己拼接格式,用System.identityHashCode(i)获取它的哈希码:

Integer i = new Integer(15);
System.out.println(i.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(i)));

这样就能看到和普通对象一致的输出样式啦~

内容的提问来源于stack exchange,提问作者elvis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:49:57