四种方式
1,System.identityHashCode()
2,toString()
3,直接打印
4,反射
System.identityHashCode()
这个方法提供了与hashCode()类似的功能,但其目的是为了在对象的生命周期内提供一个稳定的标识符,即便hashCode()被重写
hashCode()方法
Object类中定义的hashCode()方法返回对象的哈希码,这个哈希码在程序执行期间对于同一对象是稳定的,可以用来间接表示对象的唯一性,但他并不是实际内存地址。
ps:这几种其实都不是真正的底层内存地址,而是由JVM分配给对象的唯一标识符。
toString
这个在Object类中有源码:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
即返回一个包含类名,一个“@”符号和哈希码的字符串。
直接打印对象引用
直接打印一个对象,java会调用这个对象的toString方法,和toString有点像,不过实际上是16进制的哈希码。
反射访问Object类的value字段
尝试访问Object类的value字段,但实际上Object类并没有这样一个字段。value字段通常出现在某些内部类或特定实现中,例如在AtomicInteger等类中,但这并不适用于Object类。所有这个方法实际上运行会抛出异常。
测试实验代码
import java.lang.reflect.Field;
public class Dayin {
public static void main(String[] args) throws Exception{
//hashCode
Object obj = new Object();
System.out.println(System.identityHashCode(obj));
//toString
System.out.println(obj.toString());
//直接打印
System.out.println(obj);
//反射
Field field = Object.class.getDeclaredField("value");
field.setAccessible(true);
System.out.println(field.get(obj));
}
}
运行结果: