为什么print和println输出java对象时会打印内存地址?
Posted bug菌√
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么print和println输出java对象时会打印内存地址?相关的知识,希望对你有一定的参考价值。
Hi,我是bug菌,我今日前来,是带着问题来的。请听题:
1、为什么print和println输出java对象时会打印内存地址?
2、为什么输出java对象时toString 方法会自动被调用?
越是不起眼的,就越是容易被疏忽!很多小伙伴都可能会讲,这经常使用的,突然被这么一问,肯定三秒内都想不起来。
... ...
今天我就来谈谈这个不起眼的细节,帮助小伙伴们回忆回忆。
一、查源码:
先查阅下 print 和 println 的源码:发现打开了的是jdk自带的 rt.jar 包。
拓展:
rt.jar是Java的基础类库,也就是Java doc里面看到的所有的类的class文件。
例如 java.lang.String,java.lang.Thread,java.util.ArrayList或java.io.InputStream等,以及所有Java API中的其他类等都来自该包。
PrintStream类
看源码发现一个共同点,那就是都调用了String类提供的valueOf()方法。
刨根问底,找valueOf() 的源码:
String类
解读:valueOf()当传入空对象,则返回"null"字符串,否则调用Object类的toString()方法。
这也就解释了第二个问题 “为什么输出java对象时toString 方法会自动被调用?”。大家都明白了啵。
其次我们都知道:Object是所有java类的父类。所以,所有的Java对象都可以调用Object类提供的方法。toString()就是其中一个。
所以,我们接着刨根问底,看看toString()到底做了什么?
Object类
好家伙,看了源码,原来罪魁祸首就是它!
返回的是一个字符串。该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。
return getClass().getName() + "@" + Integer.toHexString(hashCode());
拓展:
toHexString(int i):以十六进制的无符号整数形式返回一个整数参数的字符串表示形式。
所以, 这就是当我们调用 print 或者 println 打印一个对象时,它会打印出这个对象的内存地址的最终根源。
二、重写toString()
重写前,输出打印:
重写toString()。ps:当然,可根据不同的需求来重写toString方法,我只是举个例子。
@Override
public String toString()
return this.id + " - " + this.name+ " - " +this.getSex();
重写后,输出打印:
解读:
因为重写toString()之后,那么在调用toString()方法的时候,会优先调用自己类里的toString()方法(如上我就是指定输出了该对象的某些字段信息)。至于为什么会先调用本类的方法??可以自己再去回顾一下java三大特性之多态 ,就明白啦~,这里就不展开细讲了,比毕竟老掉牙的内容啦。
好啦!两个疑问都替大家解答了,看到这里,不给赞吗?
好啦!两个疑问都替大家解答了,看到这里,不给赞吗?
好啦!两个疑问都替大家解答了,看到这里,不给赞吗?
❤如果文章对您有所帮助,就请在文章末尾的左下角把大拇指点亮吧!(#^.^#);
❤如果喜欢bug菌分享的文章,就请给bug菌点个关注吧!(๑′ᴗ‵๑)づ╭❤~;
❤对文章有任何问题欢迎小伙伴们下方留言或者入群探讨【群号:708072830】;
❤鉴于个人经验有限,所有观点及技术研点,如有异议,请直接回复参与讨论(请勿发表攻击言论,谢谢);
❤版权声明:本文为博主原创文章,转载请附上原文出处链接和本文声明,版权所有,盗版必究!(*^▽^*).
以上是关于为什么print和println输出java对象时会打印内存地址?的主要内容,如果未能解决你的问题,请参考以下文章
为什么print和println输出java对象时会打印内存地址?