JAVA中String是引用类型,为什么打印出来的是值,不是地址值?String的toString方法return this本身返回?

System.out.println表示打印输出流(输出位置为控制台由jvm指定)

调用println方法,println有10个重载方法,

第一个空参很好理解就是输出一个换行,

第二个到第七个参数都是基本数据类型都是通过String.valueOf(x)将不同数据类型转换为String,就是是调用了包装类的toString方法将值转换成byte[],再通过new String(char value[])创建String对象返回,

参数boolean的重载方法不是调用包装类的静态toString方法,其实代码体跟包装类的静态toString方法是一样的,可以认为调用包装类的静态toString方法转换为String。

 第八个重载方法参数char[]直接进行输出操作不用转换成字符串

 第九个重载方法参数String,通过上面包装类转换String大概就能理解为什么String的toString会返回this本身地址了,因为后续输出打印需要通过地址获取char[]然后输出char[];

 第10个重载方法参数Object调用了自身的toString方法

你是否似曾相识,其实这就是你在打印对象的时候输出的地址值,而这地址值也成为“逻辑地址值”,是通过调用 hashCode() 方法得来的,hashCode() 被native修饰,不必考虑所以一个普通的对象如果没有重写toString() 方法,自然会得到如下形式的输出

全类名+‘@’+hashCode

为了明白为什么打印不是地址而是值进入writeln方法,synchronized (this)表示同步代码块,线程单进单出,再进入textOut.write(s)

再进入wirte()

这个就显然易见,write就是获取String的char[]对象,返回write输出。这就解释通了为什么sout输出的不是地址而是值,值就是字节数组输出连成的字符串。

再插一句jdk9版本的String之前用的是char[]存储,jdk9版本的String之后用的是byte[]存储

这时就有一个疑问为什么getChars读取的是char[]跟String的byte[]类型也不匹配,

我们点进getChars

在点进getChars

再点进inflate,就会发现byte[] 遍历强转为了 char[];

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值