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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

public class Test{
   public String toString(){
        return "javatoString方法";
   }
}
然后编写main方法,实例化这个对象,并输出这句话
public static void main(String[] args){
      Test t = new Test();
      System.out.print(t)
}
就是这里我很郁闷,为什么直接打印t就相当于调用toString()方法呢。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

9 个回复

倒序浏览
本帖最后由 未来希望 于 2014-1-3 23:39 编辑

System.out.print(t)你直接打印了t对象,而System.out传给了方法print(),print()里面是自动调用t.toString(),System.out.print(t)等价于System.out.print(t.toString())而你在Test类里面写了toString()方法就相当于方法重写
回复 使用道具 举报
out是PrintStream的对象,其方法pritln描述如下
public void println(Object x)打印 Object,然后终止该行。此方法首先调用 String.valueOf(x) 获取打印对象的字符串值,然后的行为如同先调用 print(String) 再调用 println() 一样。
valueOf(x)描述如下:
public static String valueOf(Object obj)返回 Object 参数的字符串表示形式。
返回:
如果参数为 null,则字符串等于 "null";否则,返回 obj.toString() 的值。

而println()只是输出个换行符。
总的来说System.out.print(Object obj) 就是要先调用你对象的toString然后再换行。
而且你复写了Object的 toString()方法,自然调用你子类的方法了。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
我也 查过 源码了 其实挺简单的 楼主 应该明白了吧 楼上讲的很细 print 会调 valueof 。valueof又会调对象的tostring
回复 使用道具 举报
本帖最后由 王琪 于 2014-1-4 00:21 编辑

1.java 中有一个特殊的类,就是Object类,所有类都继承这个类,并通过覆写实现其中的抽象方法。
  1. Person extends Object{
  2.   String name="嘻嘻";
复制代码
    但是会出现这样结果  是乱码

在JDK中这样表示

toStringpublic String toString()返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。 Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:
   getClass().getName() + '@' + Integer.toHexString(hashCode())
关于getclass():Objectpublic Object()
[size=+2]方法详细信息
getClasspublic final Class<?> getClass()返回此 Object 的运行时类。返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。 实际结果类型是 Class<? extends |X|>,其中 |X| 表示清除表达式中的静态类型,该表达式调用 getClass。 例如,以下代码片段中不需要强制转换:
Number n = 0;
Class<? extends Number> c = n.getClass();
返回:表示此对象运行时类的 Class 对象。


但如果覆写了Person继承的toString()方法,那么在开启打印流System.out.println()时就会调用这个方法:

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
t是Test类的一个对象,你输出一个对象,会呈现出里面的方法楼主可以尝试下
public class Test{
   public String toString(){
        return "javatoString方法";
   }
   public String toString_1()(){
        return "javatoString_1方法";
   }

}
public static void main(String[] args){
      Test t = new Test();
      System.out.print(t)
}
试试有何不同,应该能加深你的理解

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
这是我查的源码
  1. /**
  2.          * Prints an object.  The string produced by the <code>{@link
  3.          * java.lang.String#valueOf(Object)}</code> method is translated

  4. into bytes
  5.          * according to the platform's default character encoding, and

  6. these bytes
  7.          * are written in exactly the manner of the <code>{@link #write

  8. (int)}</code>
  9.          * method.
  10.          *
  11.          * @param      obj   The <code>Object</code> to be printed
  12.          * @see        java.lang.Object#toString()
  13.          */
  14.         public void print(Object obj) {
  15.             write(String.valueOf(obj));
  16.         }
  17.         
  18.         /**
  19.          * Returns the string representation of the <code>Object</code>

  20. argument.
  21.          *
  22.          * @param   obj   an <code>Object</code>.
  23.          * @return  if the argument is <code>null</code>, then a string

  24. equal to
  25.          *          <code>"null"</code>; otherwise, the value of
  26.          *          <code>obj.toString()</code> is returned.
  27.          * @see     java.lang.Object#toString()
  28.          */
  29.         public static String valueOf(Object obj) {
  30.             return (obj == null) ? "null" : obj.toString();
  31.         }
复制代码

解释如下
System.out为PrintStream流,他的print(Object obj)方法调用String的valueOf

(Object obj)方法,String的valueOf方法判断如果obj为空的话,返回“nul”,否则返

回obj.toString()
这下你可明白

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
这是因为每一类中都有toString()这个方法,当你复写实现了这个方法时,输出对象时,他会自动调用toSting()方法的

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
lwx 中级黑马 2014-1-4 17:22:23
9#
用System.out.println()输出一个对象的时候,java默认调用对象的toString()方法
一般你要覆盖这个方法,这样根据覆盖逻辑你就可以输出自己的对象
比如你定义一个类User,有id,name属性,你直接输出一个user对象的话
System.out.println(user),得到的只是
全限定名@地址首地址
如果你在User类里面覆盖这个toString方法的话就能输出你要的
比如
public String toString(){
    return "user name is:"+this.name+";"+"user id is:"+this.id;
}
这样你输出一个user对象就是
User user = new User(1,"zhangshan");
System.out.println(user);
得到:user name is :zhangshan;user id is: 1;

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
这也是我想问的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马