黑马程序员技术交流社区

标题: 大家帮忙看看这个程序 [打印本页]

作者: 李小丰    时间: 2012-2-5 10:35
标题: 大家帮忙看看这个程序
[code=java]public class TestInteger {
        public static void main(String[] args) {
                int w = new Integer(args[0]).intValue();
                int h = Integer.parseInt(args[1]);
                // int h = Integer.valueOf(args[1]).intValue();
                for (int i = 0; i < w; i++) {
                        StringBuffer sb = new StringBuffer();
                        
                        for (int j = 0; j < h; j++) {
                                sb.append('*');
                        }
                        System.out.println(sb.toString());
                }

        }
}[/code]这个程序是测试基本类型数据包装类的,疑问是在System.out.println(sb.toString());
这一句,不解为什么要转换成String 类型呢,直接System.out.println(sb);也可以得到结果,为什么这样做呢?

作者: 黑马唐浩    时间: 2012-2-5 10:40
我觉得啊
如果你直接执行的是System.out.println(sb)。
那么这里调用的是Object的toString()方法。打印的东西是“<类名>+'@'+<本实例的哈希码>”值。
没有多大意思。
而如果你执行的是System.out.println(sb.toString());那么在此之前你可以重写一下toString()方法。
让他返回一下更有意思的内容。
作者: 陈时峰    时间: 2012-2-5 11:39
其实直接打印StringBuffer和打印StringBuffer的toString方法是一样的,
因为打印StringBuffer就是调用它的toString方法。
但是sb.toString返回的是字符串,这样我们可以用处理字符串的方法来处理
StringBuffer的内容。
作者: 王文龙    时间: 2012-2-5 12:07
我认为,
加不加toString()打印的内容一样,
但,
当你打印new Person("","")这个对象时,
会调用自己复写好的toString()方法来打印自定义好的格式;
同样StringBuffer存放的也是一个对象,
也习惯性地用toString()方法来打印。
不知道这样理解对不对。
作者: 王文龙    时间: 2012-2-5 12:16
System.out.print(o);
如果O是一个对象,
系统会自己默认调用Object类中的toString()方法,
打印出类名@hashcode;
但StringBuffer已复写了toString()方法,
打印出已复写好的格式。

所以加不加toString()都是OK的。

作者: 王_涛    时间: 2012-2-5 14:08
System.out.println(sb);隐式的是System.out.println(sb.toString());

打印语句的底层实现也调用toString(),所以写不写toString()都一样

来自于API
java.io.PrintStream类
public void println(Object x)打印 Object,然后终止该行。此方法首先调用 String.valueOf(x) 获取打印对象的字符串值,然后的行为如同先调用 print(String) 再调用 println() 一样。

参数:
x - 要打印的 Object。

String类
public static String valueOf(Object obj)返回 Object 参数的字符串表示形式。

参数:
obj - 一个 Object。
返回:
如果参数为 null,则字符串等于 "null";否则,返回 obj.toString() 的值。
另请参见:
Object.toString()
作者: 王_涛    时间: 2012-2-5 14:10
由多态的特性,我想你知道这个toString()到底是Objec的还是子类的。

回答完毕!
作者: 衣服    时间: 2012-2-5 14:36
sb.toString()  加了就用自己的,不加就用Object的     
作者: 最初的理想    时间: 2012-2-5 17:25
直接打印对象会调用对象的toStrin()方法,如果它没有重写从父类继承的toString方法,就调用了从父类继承的toString方法 这个方法和父类具有一样的行为就是打印出“<类名>+'@'+<本实例的哈希码>” 如果重写了toString就会调用自己的toString执行自己特有的动作!




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