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

能否通过toString返回的地址字符串获取原Java对象?

能否通过toString()返回的地址字符串获取原Java对象?

问题描述

我有个疑问:假设我有一个未重写toString()方法的Student类对象s1,把s1.toString()传入myFunc函数后,能不能通过这个地址字符串拿到原对象s1?代码示例如下:

public static void main(){ 
    Student s1; 
    myFunc(s1.toString()); 
} 
public static void myFunc(String address){ 
    Student s2; 
    s2 = // 想从address字符串获取s1对象
}

回答

很遗憾,这是做不到的,原因主要有这几点:

  • 首先得纠正一个误解:默认toString()返回的类名@十六进制字符串里的十六进制值,不是对象的内存地址,而是对象的哈希码(由Object.hashCode()生成)。早期一些JVM实现里哈希码可能和内存地址有关,但现在主流JVM(比如HotSpot)已经不会这么做了,哈希码是一个固定计算的数值,哪怕对象因为GC被移动到内存的其他位置,哈希码也不会改变。所以这个字符串根本没法对应到对象的实际内存位置。
  • 就算退一万步说这个字符串真的是内存地址,Java也没有提供公开的API允许你通过内存地址直接获取对象。Java的核心设计之一就是封装内存管理,不让开发者直接操作底层内存,这是为了避免内存错误、安全问题,同时让GC能正常工作。
  • 如果你的需求是在方法间传递对象引用,完全没必要绕这个弯——直接把s1作为参数传给myFunc就好了,把方法改成public static void myFunc(Student student),这样你在方法里拿到的就是原对象的引用,直接用就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:24:00