A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨雪 高级黑马   /  2012-5-27 16:38  /  2330 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨雪 于 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,怎么都觉得应该打印的是地址值的,求解。

9 个回复

倒序浏览
首先:toString():是利用字符串来表示对象。
当我们直接打印定义的对象的时候,隐含的是打印toString()的返回值。
可以通过子类作为一个toString()来覆盖父类的toString()。
以取得我们想得到的表现形式,即当我们想利用一个自定义的方式描述对象的时候,我们应该覆盖toString()。
然后我们在这里在看看你的person,你是不是明白了呢?为什么会打印"hello",要一个子类作为一个toString()来覆盖父类的toString()。
回复 使用道具 举报
这个很好理解的,你的Person类复写了Object的toString()方法,在打印的时候如果参数是一个实例化对象,默认是调用toString()方法的,因为你重写了那个方法所以就返回hello,你如果没有重写应该返回getClass().getName()+"@"+Integer.toHexString(hashCode())的字符串表现形式。希望能帮助你理解
回复 使用道具 举报
这个牵涉到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方法就会返回地址值。
回复 使用道具 举报
toString():是利用字符串来表示对象,它里面就包含了toString的返回值,也就是toString本身就是一个方法,所以就不需要定义静态,当如果你把toString改成toString1结果就是你所说的地址值。
回复 使用道具 举报
上帝类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:37
7#
袁培育 发表于 2012-5-27 17:01
这个牵涉到IO的问题,System也是个类,他有一个静态成员变量叫out,也就是说 System.out是用类名直接调用了 ...

回答的真好,赞一个!
回复 使用道具 举报
1.查询System的 API帮助文档
2.找到System的字段out---------out为PrintStream的一个实例。
3、查询PrintStream 和println方法--------调用了valueOf方法
4、查询valueOf方法----------如果不为null ,则调用obj的toString方法。
5、没有覆盖toString方法,可以查询Object文档中相关部分,覆盖了toString方法,就用新的方法。
希望能够帮到你~~
更多图片 小图 大图
组图打开中,请稍候......
回复 使用道具 举报
创建了一个Person对象,并且要打印新建的匿名Person对象,调用Person定义的toString()方法;
回复 使用道具 举报
打印Person时会调用toString方法,
toString重写了Object类的方法,输出的就是方法的返回值
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马