黑马程序员技术交流社区

标题: 一个小疑问,向大家求教 [打印本页]

作者: 宋国涛    时间: 2011-9-3 22:38
标题: 一个小疑问,向大家求教
[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);也可以得到结果,为什么这样做呢?
作者: 匿名    时间: 2011-9-3 22:55
toString 是返回该对象的字符串类型,如果不加toString则JVM调用默认的方法,另外我们可以自己定义toString方法,然后利用打印语句让JVM按照我们自己设置的toString方法来进行打印
作者: 匿名    时间: 2011-9-3 23:12
首先 所有的类都是Object的子类,而toString()是Ojbect中的方法,看这段简单明了的代码:[code]class Demo{        // 定义Demo类,实际上就是继承了Object类
};
public class ObjectDemo01{
        public static void main(String args[]){
                Demo d = new Demo() ;        // 实例化Demo对象
                System.out.println("不加toString()输出:"+d) ;
                System.out.println("加上toString()输出:"+d.toString()) ;
        }
};[/code]从结果中你会发现加与不加toString()完成的功能都是一样的,就证明了对象在打印的时候一定会调用toString()方法,这是默认调用的。而你举的例子其实只是为了让你理解,在使用输出的时候都会默认调用toString()方法。
再看这段代码:[code]class Person{
        private String name ;        // 定义name属性
        private int age ;        // 定义age属性
        public Person(String name,int age){
                this.name = name ;
                this.age = age ;
        }
        public String toString(){    //覆写Object 中的toString方法
                return "姓名:" + this.name + ";年龄:" + this.age ;
        }
};
public class ObjectDemo02{
        public static void main(String args[]){
                Person per = new Person("小李",30) ;         // 实例化Person
                System.out.println("对象信息:" + per) ;
        }
};[/code]从这个结果可以发现,我们并没有调用toString()方法 ,但依然得到了输出结果,近尔也证明了,toString()方法是默认调用的,只是为产明这一点。
作者: 匿名    时间: 2011-9-4 02:10
恩,涛哥的回答已经非常明白了~
通过System.out.println()打印对象的时候,调用的就是对象的toString()方法来打印的
所以,在打印对象的时候,在对象后面加不加toString()都没关系,结果完全是一样的
作者: 匿名    时间: 2011-9-4 09:24
楼上说的已经差不多了我再做点补充:
所有的类都是Object的子类,而toString()是Ojbect中的方法,如果你自己编写的类没有重写toString()方法的话,那么当打印对象的时候就会默认调用Object类的toString方法,请看Object类的toString方法源码:[code=java] public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }[/code]相反,如果子类覆盖toString方法的话,那么这就是典型的多态应用了




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