java打印地址的四种方式和源码举例

四种方式

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));
    }
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值