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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李政 中级黑马   /  2013-8-2 22:21  /  1686 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杜光 于 2013-8-4 10:16 编辑

package com.heima;

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 abstract WeekDay nextDay();
        
        public String toStirng(){
                return this==SUN?"SUN":"MON";
        }
        
        
}

//张老师讲到枚举的时候,用了一个匿名内部类
我有个疑问,这个匿名内部类里面是不是会继承父类的SUN和MON这两个全局常量,然后这个内部里也会再出现一个匿名内部类,
然后这样无限的循环下去。如果这样的话,程序不是一直在创建新对象吗,这样子就没有办法结束了。
但是程序的运行结果是正常的。

谁给说说这事怎么回事呢 就是在本类中创建子类对象,这样不就无限循环了吗

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1

查看全部评分

3 个回复

倒序浏览
final表示最终的意思,被final修饰的类是不可以被继承的,被final修饰的方法可以被继承,但不能被重写,被final修饰的变量不能被改变。所以这个类并不会无限循环下去,在这个类里边创建的两个子类对象SUN和MON只是重写了父类Weekday里的虚方法nextdDay(),因为这两个类被final修饰,所以并不会在产生子类。这两个类都是静态的,都可以通过父类名来调用。所以尽管父类构造方法私有,但仍可以通过类名调用的方法得到父类内的成员和方法,所以程序的运行是正常的!!

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1

查看全部评分

回复 使用道具 举报
首先呢,sun和mon这两个不是全局常量,而是在本类中定义的两个静态对象,而且还被final修饰了,表明这两个对象在内存里只被创建了一次,而且不会被修改,不会循环创建下去,这是static的特点.
另外,这个匿名类只是重写了本类中的nextday方法,这是个抽象方法,还没有具体实现,但返回值类型是对象类型,注意只是重写了这个方法,而不是构造函数,不会默认被调用.
此方法被调用时返回一个mon对象后不会触发mon对象再返回sun对象,原因很简单,因为mon对象不会自己调用自己的nextday方法,所以不存在循环.

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1

查看全部评分

回复 使用道具 举报 1 0
本帖最后由 李政 于 2013-8-3 11:47 编辑

即使不写final,程序一样正常
还是不太明白,先放放这个问题吧 谢谢各位
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马