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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈少文 中级黑马   /  2012-7-17 12:18  /  2262 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈少文 于 2012-7-17 13:23 编辑

创建两个类
PrintTest.class
PrintDemo.class

public class PrintTest
{
       public String str1 = "ball";
       public String str2  = "basketball";
       public String str3  = "itcast";
    //重写toString()方法  
     public  String toString()
      {
                   return str1 +":"+str2+":"+str3;
      }
}


public class PrintDemo
{
          public static void main(String[] args)
           {
                  PrintTest pt  = new PrintTest();
                  
                  System.out.println(pt);   
                 //请问一下,为什么打印时,会直接调用toString()
                 //而不是应该这样写System.out.println(pt.toString());

              
                  
              }
}

7 个回复

倒序浏览
本帖最后由 rslheima 于 2012-7-17 12:37 编辑

bs.itheima.com/thread-10432-1-1.此处有详解
因为源代码里就是这么规定的。。。。建议你去看源代码

回复 使用道具 举报
这是一个数据结构问题,只要你自定义的类覆盖了toString方法,那么你打印他的对象,系统就会自动调用已覆盖的toString方法,就像String类型的你打印你的str1就会直接出现ball一样。
回复 使用道具 举报
如果你将你重写的toString()方法去掉,然后运行程序你发现出现的是一个hash值。而加上你的toString()方法却给出的是你要输出的格式,
这是因为在你调用函数System.out.println()方法时,虚拟机会自动帮你调用java中的toString()方法,如果你重新写了toString()方法,虚拟机会调用你的方法。
System.out.println()方法在1.5版本后添加了一个自动装箱的功能(好像是1.5,毕老师当时就这么说的),它会把你扔给他的数据自动调用toString()方法转成字符串打印在控制台上。
比如后边有把List等对象,还有Properties对象扔给它时会自动以默认的toString()方法打印,如Properties对象会以键值对的形式打印。

(字有点多!)

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
Object里面已经有了toString的方法,而所有类都是继承Object,故所有对象都有这个方法。
toString方法方便了输出,比如System.out.println(xx),括号里面的“xx”如果不是String类型的话,就自动调用xx的toString()方法
回复 使用道具 举报
楼主想问的是为什么System.out.println(x)自动调用toString()吧
在java.io.PrintStream.java中是这样定义的
  1.     /**
  2.      * Prints an Object and then terminate the line.  This method calls
  3.      * at first String.valueOf(x) to get the printed object's string value,
  4.      * then behaves as
  5.      * though it invokes <code>{@link #print(String)}</code> and then
  6.      * <code>{@link #println()}</code>.
  7.      *
  8.      * @param x  The <code>Object</code> to be printed.
  9.      */
  10.     public void println(Object x) {
  11.         String s = String.valueOf(x);
  12.         synchronized (this) {
  13.             print(s);
  14.             newLine();
  15.         }
  16.     }
复制代码
所有的类又都继承Object类
这样就很明显了
回复 使用道具 举报
李勇 初级黑马 2012-7-17 13:45:35
7#
你 System.out.println();  里面放的 不是String类型的对象

所有返回的是  该对象的内存地址值  

如果是 String 类型的  会正常打印出来
回复 使用道具 举报
1、System.out.println(obj): 对Println()的解释是:
public void print(Object obj)打印对象。按照平台的默认字符串编码将 String.valueOf(obj) 方法生成的字符串转换为字节,并完全以 write(int) 方法的方式写入这些字节。

2. String.valueOf(obj)的返回结果是:①如果参数为 null,则字符串等于 "null";
                                                         ②否则,返回 obj.toString() 的值。这里调用了toString方法

3、对应toString方法:
  ①如果本类没有toString方法,那么调用父类的,看看你的 PrintTest 的父类是什么。由于默认
                      继承Object,那么就调用Object的toString()了。
                      看看Object的toString()返回值:
          Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:
getClass().getName() + '@' + Integer.toHexString(hashCode())

  ②如果本类复写了toString(),则调用本来自己的toString,那个返回结果就看你怎么写了。


4、建议①用Eclipse跟踪源代码,详细看看到底怎么执行的
            ②查看API文档,熟练文档,遇到问题先查文档。

评分

参与人数 1技术分 +1 收起 理由
黑马张扬 + 1 说的很清楚 !

查看全部评分

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