A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 燕国庆 高级黑马   /  2012-11-16 23:43  /  3185 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class EnumTest {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                Weekday weekday=Weekday.SUN;
                //System.out.println(weekday==SUN);
                //System.out.println(weekday.toString());
                System.out.println(weekday.nextDay());此处现实的结果为什么是MON(是字符串形式吗),weekday.nextDay()返回的结果不是Weekday类型的吗?此时把下面的toString方法注释掉后就不能显示MON这个结果了。若不注释的时候他是通过什么机制调用toString方法将SUN显示出来的?
               
                //System.out.println(weekday.next());

        }

}

public abstract class  Weekday {
        private Weekday(){}
        public static final Weekday SUN=new Weekday(){

                @Override
                public Weekday nextDay() {
                        // TODO Auto-generated method stub
                        return MON;
                }
               
        };
        public static final Weekday MON=new Weekday(){

                @Override
                public Weekday nextDay() {
                        // TODO Auto-generated method stub
                        return SUN;
                }
               
        };
       
        /*public Weekday nextDay(){
                if(this==SUN)
                        return MON;
                else
                        return SUN;
        }*/
       
        public String toString(){
                return this==SUN?"SUN":"MOM";
        }
        public abstract Weekday nextDay();
}

谢谢大家给个解释:)

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
1,weekday.nextDay()为什么是MON
    因为:你前面定义的weekday是SUN,又调用了nextDay()方法,所以就是MON
   2,weekday.nextDay()返回的结果是Weekday类型的,
    因为:weekday.nextDay().getClass().getName()其结果为:Weekday$1
   3,此时把下面的toString方法注释掉后就不能显示MON这个结果了。
        若不注释的时候他是通过什么机制调用toString方法将SUN显示出来的?
   因为:注释掉就调用了Object的toString方法,打印的是SUN的地址值

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
打印一个对象 就相当于是打印它的toString方法返回的String字符串
如果没有定义toString,默认是Object中的定义,但是一般来说那个对于我们没有意义
因此在类中会重写toString方法来按照我们的希望输出打印

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1

查看全部评分

回复 使用道具 举报
原因是JAVA中的toString()方法会被自动调用,如果你把toString方法复写了,那么在调用toString()方法时就会按照你复写的方法存在,如果没有复写toString()方法就会按照源代码中的操作进行操作。

点评

源代码中的操作?应该是继承Object中的toString方法打印  发表于 2012-11-18 17:40
回复 使用道具 举报
那么为什么会是MON,因为张老师在枚举类型对象中定义了几个常量,我们知道常量是不能修改的
这就是为什么用枚举的原因,Weekday抽象方法中使用了单例设计模式,这样我们就无法从外部去new对象
抽象方法无法创建实例,由子类newDay来覆盖了抽象方法,SUN这个常量在内部创建了对象并用匿名内部类
newDay方法创建返回值是MON,MON也同样创建了,然后覆盖了Object中toString方法并把常量值封装字符串常量,
这就说明为什么会打印出MON,和为什么会这样显示出来的原因

点评

那个不是单例设计模式,枚举有几个就有几个对象的  发表于 2012-11-18 17:37
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马