【PrintStream源码分析】toString()方法的调用
今天在做泛型联系的时候重写了toString()方法,偶然发现在没有调用它的情况下却输出了其中的内容。在查阅仔细看过之后决定写下心得作为进步的记录,也希望与大家分享能够帮助你们。
我们先来看下实践代码,如下图。
如上图所示,Persons类是一个定义了类型的泛型类,其中属性info是T类型。Base类中有String类型的name和int类型的age,并重写toString()方法对属性进行拼接并且return。在测试类中定义一个Base类型对象b并通过有参构造方法对属性进行赋值;再定义一个Persons类型的对象p,通过有参构造方法传入b。
往下看p.getInfo()方法应该得到的是b对象,正常情况下,对b对象进行输出应该输出的是b对象在内存中的地址,但结果输出如下:
那么问题来了,我并没有调用toString()方法,为什么会出现这种结果?
我们找到System.out.print()方法的源码来看下,他在PrintStream类中。
即打印出String.valueOf(obj)的返回值,我们再找到valueOf()方法来看下,显然是在String类中。
如果传入的obj不是空,那么久返回obj.toString()方法的结果。而前面我们传入的obj就是对象b,并已经重写了toString()方法,所以最后输出了我们重写之后的b.toString()方法的值。
***总结:***在使用print方法的时候会自动调用对应的toString()方法,这也是为什么我们并没有主动调用toString()方法就有了结果的原因。int、double等基本数据类型对应的是Integer、Double等类中的toStriing方法,可以自己尝试一下。