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 个回复

正序浏览
这也是我想问的
回复 使用道具 举报
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

查看全部评分

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

评分

参与人数 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

查看全部评分

回复 使用道具 举报
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

查看全部评分

回复 使用道具 举报
本帖最后由 王琪 于 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

查看全部评分

回复 使用道具 举报
我也 查过 源码了 其实挺简单的 楼主 应该明白了吧 楼上讲的很细 print 会调 valueof 。valueof又会调对象的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

查看全部评分

回复 使用道具 举报
本帖最后由 未来希望 于 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()方法就相当于方法重写
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马