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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马老兵 中级黑马   /  2012-4-15 17:04  /  1924 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.util.*;
class  DateDemo
{
public static void main(String[] args)
{
  Date d = new Date();
  System.out.println(d);
  Person p = new Person();
  System.out.println(p);
}
}
class Person
{
Person()
{

}
//String toString()
{
  
}
}
是不是每次输出的时候虚拟机都会调用类中的toString方法?即使我们没有写它也在调用?
上边的小程序是我进行试验的,是不是因为Date中复写了toString方法所以输出的不是一个哈希值?

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

4 个回复

倒序浏览
如果子类没有复写Object类中的toString方法,调用的就是Object类中的toString方法,复写了就调用子类的toString方法。
Date中有没有复写toString方法?我们可以查看API文档,在方法区可以看到
String toString()    把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy
                             其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。
所以Date类是复写了Object中的toString方法的
   

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
System.out.println(x); 的本质:
如果x是对象,会自动调用x的toString();方法.
如果x是基本类型就调用String.valueOf(x);返回一个字符串,然后打印.
回复 使用道具 举报
不是“许多对象都有这个方法”,而是“所有对象都有这个方法”,因为它是Object里面已经有了的方法,而所有类都是继承Object,所以“所有对象都有这个方法”

它通常只是为了方便输出,比如System.out.println(xx),括号里面的“xx”如果不是String类型的话,就自动调用xx的toString()方法

总而言之,它只是sun公司开发java的时候为了方便所有类的字符串操作而特意加入的一个方法

写这个方法的用途就是为了方便操作,所以在文件操作里面可用可不用

例子1:
public class A{
    public String toString(){return "this is A";}
}
如果某个方法里面有如下句子:
A obj=new A();
System.out.println(obj);
会得到输出:this is A

例子2:
public class A{
    public String getString(){return "this is A";}//toString改个名字试试看
}
A obj=new A();
System.out.println(obj);
会得到输出:xxxx@xxxxxxx的类名加地址形式
System.out.println(obj.getString());
会得到输出:this is A

看出区别了吗,toString的好处是在碰到“println”之类的输出方法时会自动调用,不用显式打出来

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
所有的对象都继承object,object中有toString()方法,如果子类没有重写该方法,则调用object中的toString()方法,Object类中toString()返回的字符串形式是类名@内存地址的十六制整数,所以输出的不是一个哈希值而是类名@内存地址的十六制整数的地址

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马