为什么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对象时会打印内存地址?

Java中print和println的区别

JAVA中System.out.println和System.out.print有啥区别?

print、printf、println的区别

Java中print与println的区别是?具体用法?

JAVA中关于print打印(对象)和return返回的打印顺序