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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xuchulong1 中级黑马   /  2012-10-30 16:12  /  1663 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看一个类
public class Person {    private String name = null;    private int age = 0;    public Person(String name, int age) {         this.name = name;         this.age  = age;    }    public String toString() {         return name;    }}public class Test {    public static void main(String[] args) {         Person p = new Person("Jack", 20);         System.out.println(p);// 这时会输出"Jack".    }}


         System.out.println(p);
这句话我只是打印p,加了toString()却能打印出 "jack",我们并没有去调用这个toString方法,不知道这个toString是在何时调用的??

还有toString有啥特殊的用法吗?具体一点的

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1

查看全部评分

3 个回复

倒序浏览
Java虚拟机在控制台输出结果时,会自动调用toString()方法,如果你要是起的名字不是toString的话,虚拟机是不会去调用你自定义的那个方法的,但你恰恰写成了toString,所以它调用的会是你写的那个toString()方法,你可以改成getName试试,就明白了
回复 使用道具 举报
因为你复写了person的toString()方法,你如果直接输出对象,默认是打印对象.toString();
比如说,把person的toString()方法注释掉,还用父类的方法
  1. package test;

  2. public class Test4 {
  3. public static void main(String[] args) {
  4. Person2 p = new Person2("Jack", 20);
  5. System.out.println(p);// 这时会输出"Jack". }}
  6. int a[]=new int[3];
  7. System.out.println(a.toString());
  8. }
  9. }
  10. class Person2 {
  11. private String name = null;
  12. private int age = 0;
  13. public Person2(String name, int age) {
  14. this.name = name;
  15. this.age = age;
  16. }
  17. // public String toString() {
  18. // return name;
  19. // }
  20. }
复制代码
结果是这样的:
test.Person2@4f1d0d
[I@1fc4bec

如果你复写了toString方法,就是你自定义的方法了,return name
所以结果是jack

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1

查看全部评分

回复 使用道具 举报
杨志男 发表于 2012-10-30 16:40
Java虚拟机在控制台输出结果时,会自动调用toString()方法,如果你要是起的名字不是toString的话,虚拟机是 ...

OK,基本明白了,引用二楼的,就是在输出前,编译器会去调用 toString,或者说,我们的打印函数本来就有一个默认的toString方法,我们重写了这个函数,系统就会去调用我们自己写的函数,这样就出现了这个结果了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马