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[];