黑马程序员技术交流社区

标题: 【已解决】关于toString的一个小疑惑 [打印本页]

作者: 杨雪    时间: 2012-5-27 16:38
标题: 【已解决】关于toString的一个小疑惑
本帖最后由 杨雪 于 2012-5-29 00:12 编辑
  1. class Person
  2. {
  3.         public String toString()
  4.         {
  5.                 return "Hello";
  6.         }
  7. }
  8. public class Demo
  9. {
  10.         public static void main(String[] args)
  11.         {
  12.                 System.out.println(new Person());
  13.         }
  14. }
复制代码
打印结果是Hello ,为什么?

就new了Person根本都没有调用toString方法啊,又不是static,怎么都觉得应该打印的是地址值的,求解。
作者: 飞舞❤心动    时间: 2012-5-27 16:56
首先:toString():是利用字符串来表示对象。
当我们直接打印定义的对象的时候,隐含的是打印toString()的返回值。
可以通过子类作为一个toString()来覆盖父类的toString()。
以取得我们想得到的表现形式,即当我们想利用一个自定义的方式描述对象的时候,我们应该覆盖toString()。
然后我们在这里在看看你的person,你是不是明白了呢?为什么会打印"hello",要一个子类作为一个toString()来覆盖父类的toString()。

作者: 丰亚彬    时间: 2012-5-27 16:59
这个很好理解的,你的Person类复写了Object的toString()方法,在打印的时候如果参数是一个实例化对象,默认是调用toString()方法的,因为你重写了那个方法所以就返回hello,你如果没有重写应该返回getClass().getName()+"@"+Integer.toHexString(hashCode())的字符串表现形式。希望能帮助你理解
作者: 袁培育    时间: 2012-5-27 17:01
这个牵涉到IO的问题,System也是个类,他有一个静态成员变量叫out,也就是说 System.out是用类名直接调用了System的静态成员变量out,他的返回值是Printstream,它是字节输入流的一个字类,他有一个println(Object x)的方法,这个方法会自动调用String.valueOf(x),而String.valueOf(x)又会调用x的toString()方法,即System.out.println(new Person())这句话就会自动调用new Person()的toString方法收到返回值“hello”并输出。如果你不复写toString方法就会返回地址值。

作者: 黑马-唐磊    时间: 2012-5-27 17:10
toString():是利用字符串来表示对象,它里面就包含了toString的返回值,也就是toString本身就是一个方法,所以就不需要定义静态,当如果你把toString改成toString1结果就是你所说的地址值。
作者: whocases    时间: 2012-5-27 17:27
上帝类Object 中有toString()方法,这个方法是被自动调用的。

以下是jdk的帮助文档中Object类中对toString()方法的描述(绝非本人所写,本人还没那个本事):
---------------jdk帮助文档------开始部分---------------
toString
public String toString()返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂。建议所有子类都重写此方法。
Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:

getClass().getName() + '@' + Integer.toHexString(hashCode())

返回:
该对象的字符串表示形式。
---------------jdk帮助文档------结束部分---------------

以下是本人理解:
注意:
如果重写了这个方法的话,在打印的时候就会调用你的这个方法,而你写的这个方法中,只返回了Hello;

你可以注释掉你的toString()方法,看看打印的是什么东东。
或者你修改了toString方法的方法名也可以(也就是在不重写Object类的toString方法的情况下照样是要打印东西的。重写了这个方法,当然要打印你的Hello了)。
不知道我的回答是否靠谱,如不靠谱,请指正。我会关注的。
说明:toString这个方法,尽量不要重写。除非特别的情况。当然了。个人看法,个人看法。
作者: 徐炯    时间: 2012-5-27 18:21
袁培育 发表于 2012-5-27 17:01
这个牵涉到IO的问题,System也是个类,他有一个静态成员变量叫out,也就是说 System.out是用类名直接调用了 ...

回答的真好,赞一个!
作者: xieshuhua    时间: 2012-5-27 18:28
1.查询System的 API帮助文档
2.找到System的字段out---------out为PrintStream的一个实例。
3、查询PrintStream 和println方法--------调用了valueOf方法
4、查询valueOf方法----------如果不为null ,则调用obj的toString方法。
5、没有覆盖toString方法,可以查询Object文档中相关部分,覆盖了toString方法,就用新的方法。
希望能够帮到你~~

PrintScream中println方法.png (1.51 KB, 下载次数: 57)

PrintScream中println方法.png

String的valueOf方法.png (5.61 KB, 下载次数: 57)

String的valueOf方法.png

System的字段out.png (5.32 KB, 下载次数: 53)

System的字段out.png

System类.png (2.15 KB, 下载次数: 55)

System类.png

作者: 路冬冬    时间: 2012-5-28 00:06
创建了一个Person对象,并且要打印新建的匿名Person对象,调用Person定义的toString()方法;
作者: 小小企鹅    时间: 2012-5-28 01:01
打印Person时会调用toString方法,
toString重写了Object类的方法,输出的就是方法的返回值




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2