黑马程序员技术交流社区

标题: toString的一点疑问[已解决] [打印本页]

作者: 王金科    时间: 2012-8-21 19:23
标题: toString的一点疑问[已解决]
本帖最后由 王金科 于 2012-8-23 15:38 编辑
  1. import java.io.*;
  2. public class  ByteArrayStreamDemo
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 //数据源
  7.                 ByteArrayInputStream bis = new ByteArrayInputStream("abcdef".getBytes());
  8.                 //数据目的地
  9.                 ByteArrayOutputStream bos = new ByteArrayOutputStream();

  10.                
  11.                 int by = 0;
  12.                 while((by=bis.read())!=-1)
  13.                 {
  14.                         bos.write(by);
  15.                         //System.out.println(bos);
  16.                 }
  17.                
  18.                 System.out.println(bos.size());
  19.                 System.out.println(bos.toString());//System.out.println(bos);
  20.         }
  21. }

  22. System.out.println(bos.toString());//System.out.println(bos);

  23. 这里有没有toString打印的结果都一样,那么有什么本质的区别,会产生什么影响?



  24. import java.io.CharArrayReader;
  25. import java.io.CharArrayWriter;
  26. import java.io.IOException;

  27. public class CharArrayReaderDemo {

  28.         /**
  29.          * @param args
  30.          * @throws IOException
  31.          */
  32.         public static void main(String[] args) throws IOException {
  33.                 // TODO Auto-generated method stub

  34.                 CharArrayReader cr = new CharArrayReader("ASasdsadas".toCharArray());
  35.                 CharArrayWriter cw = new CharArrayWriter();
  36.                
  37.                 int len = 0;
  38.                 while((len=cr.read())!=-1){
  39.                         cw.write(len);
  40.                         //System.out.println(cw);
  41.                 }
  42.                 System.out.println(cw.size());
  43.                 System.out.println(cw.toString());//System.out.println(cw);
  44.         }
  45. }


  46. 这段代码也一样,有没有toString打印的结果都一样,那么有什么本质的区别,会产生什么影响?
复制代码

作者: 刘芮铭    时间: 2012-8-21 19:25
本帖最后由 刘芮铭 于 2012-8-21 19:42 编辑

你如果复写掉toString方法的话  就不一样了  应该你没有复写掉   所以都为默认!

在你的例子里没有任何区别,但是参数如果是Object类型的,那么是有区别的,例如:
public String toString(Student s){
return s.toString();
}会返回Student的toString方法的返回值,如果你不覆盖Student的toString方法的话,继承自Object类的
toString方法格式 是  包名.类名@xxxx   
直接返回s 好像是不会编译通过的通常我在使用toString()方法时,
是为了输出时代码方便,统一输出格式,
比如Student s = xxxxx;System.out.println(s);这样就会打印s的toString()的值

作者: 王金科    时间: 2012-8-21 19:35
刘芮铭 发表于 2012-8-21 19:25
你如果复写掉toString方法的话  就不一样了  应该你没有复写掉   所以都为默认! ...

System.out.println(bos.toString());
System.out.println(bos);
这两句话打印效果一模一样,那还不如省掉不写咯?
作者: 刘芮铭    时间: 2012-8-21 19:39
王金科 发表于 2012-8-21 19:35
System.out.println(bos.toString());
System.out.println(bos);
这两句话打印效果一模一样,那还不如省掉 ...

在你的例子里没有任何区别,但是参数如果是Object类型的,那么是有区别的,例如:
public String toString(Student s){
return s.toString();
}
会返回Student的toString方法的返回值,如果你不覆盖Student的toString方法的话,继承自Object类的toString方法格式 是  包名.类名@xxxx   
直接返回s 好像是不会编译通过的
通常我在使用toString()方法时,是为了输出时代码方便,统一输出格式,比如
Student s = xxxxx;
System.out.println(s);
这样就会打印s的toString()的值

作者: 王金科    时间: 2012-8-21 19:40
刘芮铭 发表于 2012-8-21 19:39
在你的例子里没有任何区别,但是参数如果是Object类型的,那么是有区别的,例如:
public String toStrin ...

嗯,这好似覆盖toString方法,好返回我们需要的内容
作者: 王少岩    时间: 2012-8-21 19:46
首先要搞清楚println的执行过程源码里面很清楚:
PrintStream(System.out):
     public void println(Object x) {
         String s = String.valueOf(x);
         synchronized (this) {
             print(s);
             newLine();
         }
     }

String:
     public static String valueOf(Object obj) {
         return (obj == null) ? "null" : obj.toString();
     }

Object:
     public String toString() {
         return getClass().getName() + "@" + Integer.toHexString(hashCode());
     }
看看原码就懂了。
要打印的内容首先要执行String.valueOf(x)方法,然后根据判断决定打印"null"还是执行toString方法。当子类覆盖toString方法后,按照覆盖的规则打印,否则按照Object类的tostring方法中的规则打印。

作者: 王金科    时间: 2012-8-21 19:55
王少岩 发表于 2012-8-21 19:46
首先要搞清楚println的执行过程源码里面很清楚:
PrintStream(System.out):
     public void println(Obje ...

哦,理解了:victory:
作者: 曹晓涵    时间: 2012-8-21 21:10
toString()方法是Object类中的方法,所有类都继承Object,可以认为所有对象都与toString()方法。
为了方便输出,对于System.out.println(xxxxxx)邮局,括号里面的“xxxxxxx”如果不是String类型的话,就自动调用xxxxxx的toString()方法
也就是不管你加或不加都会自动调用toString()方法,当内容为类或对象时或可以调用toString()方法的任何对象,System.out.println(xxxxxx)语句System.out.println(xxxxxx.toString())输出内容一定一样。
返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于: getClass().getName() + '@' + Integer.toHexString(hashCode())
  1. import java.io.*;
  2. public class ByteArrayStreamDemo
  3. {
  4. public String toString()
  5. {
  6. return "ByteArrayStreamDemo类的自定义toString()方法";
  7. }
  8. public static void main(String[] args) throws IOException
  9. {
  10. //数据源
  11. ByteArrayInputStream bis = new ByteArrayInputStream("abcdef".getBytes());
  12. //数据目的地
  13. ByteArrayOutputStream bos = new ByteArrayOutputStream();


  14. int by = 0;
  15. while((by=bis.read())!=-1)
  16. {
  17. bos.write(by);
  18. //System.out.println(bos);
  19. }
  20. ByteArrayStreamDemo bas = new ByteArrayStreamDemo();
  21. System.out.println(bos.size());//输出:6
  22. //------------------------------------当API中的类对象自带toString()方法时-----------------------------------------------------------------------
  23. /*虽然ByteArrayStreamDemo类中覆写了toString()方法,但只对当前类对象有效,并未覆写其他类中的toString().
  24. ByteArrayOutputStream有自带的toString()方法,与Object父类中的toString()方法不同
  25. ByteArrayOutputStream类的toString()方法使用平台默认的字符集,通过解码字节将缓冲区内容转换为字符串。*/
  26. System.out.println(bos.toString());//输出:abcdef
  27. //System.out.println()语句会自动调用ByteArrayOutputStream类中的自由toString()方法,同上
  28. System.out.println(bos);//输出:abcdef
  29. //------------------------------------当自定义类对象覆写toString()方法时-----------------------------------------------------------------------
  30. /*ByteArrayStreamDemo类中覆写了toString()方法,所以当类的实例化对象调用toString()是返回自定义toString()方法的值*/
  31. System.out.println(bas.toString());//输出:byteArrayReaderDemo类的自定义toString()方法
  32. //System.out.println(bas);语句自动调用本类中的toString()方法,同上。
  33. //System.out.println()语句会自动调用自定义ByteArrayStreamDemo类中的自定义toString()方法,同上
  34. System.out.println(bas);//输出:byteArrayReaderDemo类的自定义toString()方法
  35. //-------------------------------------当自定义类对象没有toString()方法时--------------------------------------
  36. /*虽然ByteArrayStreamDemo类中覆写了toString()方法,但只对当前类对象有效,并未覆写其他类中的toString().
  37. CharArrayReaderDemo自定义类中没有toString()方法,但其Object父类中有toString()方法,故此时调用了Object类中的toString(),
  38. Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。
  39. 换句话说,该方法返回一个字符串,它的值等于:CharArrayReaderDemo@152B6651 */
  40. System.out.println(new CharArrayReaderDemo().toString());////输出:CharArrayReaderDemo@152B6651
  41. //System.out.println()语句会自动调用自定义父类Object类中的toString()方法,同上。
  42. System.out.println(new CharArrayReaderDemo());//CharArrayReaderDemo@152B6651
  43. //------------------当System.out.println()中输出的为基本数据类型,对象中的字段,引用类型中的元素时------------------------------
  44. /*
  45. 基本数据类型不能直接调用toString()方法,必须转换成包装类后才可调用。
  46. */
  47. System.out.println(1);//输出1 相当于System.out.println(1+"")
  48. System.out.println(new Integer(1));//输出:1 相当于System.out.println(new Integer.toString())
  49. System.out.println(new Integer(1).toString());//输出1
  50. //演示类CharArrayReaderDemo中的方法
  51. new CharArrayReaderDemo().carDemo();
  52. }
  53. }

  54. class CharArrayReaderDemo {

  55. /**
  56. * @param args
  57. * @throws IOException
  58. */
  59. public static void carDemo() throws IOException {
  60. // TODO Auto-generated method stub

  61. CharArrayReader cr = new CharArrayReader("ASasdsadas".toCharArray());
  62. CharArrayWriter cw = new CharArrayWriter();

  63. int len = 0;
  64. while((len=cr.read())!=-1){
  65. cw.write(len);
  66. //System.out.println(cw);
  67. }
  68. System.out.println(cw.size());//输出:10
  69. //------------------------------------当API中的类对象自带toString()方法时-----------------------------------------------------------------------
  70. /*虽然ByteArrayStreamDemo类中覆写了toString()方法,但只对当前类对象有效,并未覆写其他类中的toString().
  71. CharArrayWriter有自带的toString()方法,与Object父类中的toString()方法不同
  72. CharArrayWriter类的toString()方法使用平台默认的字符集,通过解码字节将缓冲区内容转换为字符串。*/
  73. System.out.println(cw.toString());//输出:ASasdsadas
  74. //System.out.println()语句会自动调用CharArrayWriter类中的自由toString()方法,同上
  75. System.out.println(cw);//输出:ASasdsadas

  76. }
  77. }
复制代码

作者: 王金科    时间: 2012-8-22 23:33
曹晓涵 发表于 2012-8-21 21:10
toString()方法是Object类中的方法,所有类都继承Object,可以认为所有对象都与toString()方法。
为了方便 ...

兄弟,你说的很透彻,我理解了,谢谢啦




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2