黑马程序员技术交流社区

标题: toString()是怎么被自动调用的? [打印本页]

作者: 刘晓康    时间: 2012-4-5 20:16
标题: toString()是怎么被自动调用的?
public abstract class WeekDay1 {
        private WeekDay1(){}
        
        public final static WeekDay1 SUN = new WeekDay1(){
                public WeekDay1 nextDay() {        
                        return MON;
                }        
        };

        public final static WeekDay1 MON = new WeekDay1(){               
                public WeekDay1 nextDay() {               
                        return SUN;
                }        
        };        
        
        public abstract WeekDay1 nextDay();
        
        public String toString(){
                return this==SUN?"SUN":"MON";
        }
}
public class EnumTest {
        public static void main(String[] args) {
        WeekDay1 weekDay = WeekDay1.MON;
        System.out.println(weekDay.nextDay());//weekDay.nextDay()得到的是对象 但打印的时候却打印出的字符串,调用tostring()方法的原理是什么???都有什么情况会调用他?如果这样写呢weekDay.nextDay().tostring()   
       }
}

作者: 郑苑东    时间: 2012-4-5 20:22
当你打印一个对象时会自动调用toString()方法。。即使你没把toString方法写上。。一般的对象打印是因为没有重写toString()方法会调用所有类的父类。也就是Object类中的toString()方法。。Object类中的toString() ,默认格式就是 类型@对象地址    的形式。。。。因为字符串中重写了toString()方法。。重写之后打印的时字符串中的内容。我们也可以根据自己的需要重写toString()方法。。。
作者: 秦岩    时间: 2012-4-5 20:26
返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。 这个api上写的,说明的打印对象的字符串形式,但是一般都会重写这个类,因为通常System.out.println()对象的输出格式不是我们想要的,就可以通过改写toString().只要是输出格式的问题
作者: 邓斌    时间: 2012-4-5 21:21
复制楼主代码始终编译不通过
Weekday1.java:1: 错误: 类WeekDay1是公共的, 应在名为 WeekDay1.java 的文件中声明
public abstract class WeekDay1 {
                ^
Weekday1.java:22: 错误: 类EnumTest是公共的, 应在名为 EnumTest.java 的文件中声明
public class EnumTest {
       ^

去掉第一行代码中 public  吧文件名改成EnumTest.java  编译才通过  
通过百度才知道的。java的特性,公有类必须在与类名同名的文件中定义。
也就是说,你的这段代码的文件名必须是SetApple.java,不然编译不了的。

输出SUM..   
OK.应为水平不行。代码有点看不懂事项表达什么。既然
在WeekDay1中定创建
WeekDay1 SUN = new WeekDay1
在main中创建
WeekDay1 weekDay = WeekDay1.MON;
调用了
weekDay.nextDay()
而在
WeekDay1 weekDay = WeekDay1.MON;是创建了MON对象。
MON中方法是
/*public final static WeekDay1 MON = new WeekDay1(){               
                public WeekDay1 nextDay() {               
                        return SUN;
                }        
        };        
*/
回一个SUN对象。

System.out.println(weekDay.nextDay())  输出SUN。。
/*
public String toString(){
                return this==SUN?"SUN":"MON";
        }
*/

这段代码复写了上帝的toString  
返回的如果是如果是SUN对象。就返回"SUN" 如果不是就“MON”
既然复写了toString  返回的是自符串。输出当然是SUN  字符串
反过来
//  return this==SUN?"MON":"SUN";

输出的就是MON。。
去掉这段代码
/*public String toString(){
                return this==SUN?"SUN":"MON";
        }
*/
System.out.println(weekDay.nextDay());
输出的就是
WeekDay1$1@bdb503
所以。。这个WeekDay1$1@bdb503    就是对象。这是上帝的toString




作者: 白磊    时间: 2013-5-8 16:06
weekDay.nextDay()得到的是对象 ,但打印的时候却打印出的字符串,因为打印对象的时候会自动调用toString()方法的,
你如果这样写呢weekDay.nextDay().toString()也行,效果是一样的。
toString()方法,是Object类中的方法,也就是所有的对象都可以调用此方法,当打印一个类时,就会自动调用它的toString()方法,默认格式就是  类名@对象地址    的形式,可以根据自己的显示效果需要,重写toString()方法。




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