能否通过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
相关产品推荐
相关产品推荐

