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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 樊其杰 于 2013-3-15 16:45 编辑
  1. public enum TrafficLamp {
  2. RED {
  3. public TrafficLamp nextLamp() {
  4. return GREEN;
  5. }

  6. },
  7. GREEN {
  8. public TrafficLamp nextLamp() {
  9. return YELLOW;
  10. }
  11. },
  12. YELLOW {
  13. public TrafficLamp nextLamp() {
  14. return RED;
  15. }

  16. };

  17. public abstract TrafficLamp nextLamp();
  18. }
复制代码
张老师视频中说RED是由TrafficLamp的子类实现是什么意思,哪位帮我分析下这个代码原理?

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

4 个回复

倒序浏览
其实你掌握住这两点你就很好理解了:
(1)如果TrafficLamp中没有抽象方法,那么RED,Green,YELLOW就是TrafficLamp的实例对象。
(2)如果TrafficLamp中有抽象方法,那么TrafficLamp不能直接实例化,只有实现了该抽象方法的子类才能实例化,此时RED,Green,YELLOW就是TrafficLamp子类的实例对象。他们和TrafficLamp就是类与对象的关系,抽象与具体的关系。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
结合前面老张讲的枚举的普通类模拟实现,其实RED就是这样来的:public static final TrafficLamp RED=new TrafficLamp();
上面那句结合在你给的代码中:RED {
public TrafficLamp nextLamp() {
return GREEN;
}
可以这样写:public static final TrafficLamp RED=new TrafficLamp() {
return GREEN;
}

这不就是匿名内部类的写法么。而匿名内部类前面的new TrafficLamp()的TrafficLamp就是它的父类名。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报

不知道怎么说,我没看枚举源代码,估计源代码把人们写的枚举类,变成了下面的注释部分一样思路的代码,或者说类似的代码

public enum TrafficLamp        
{
        RED
        {
                public TrafficLamp nextLamp()
                {
                        return GREEN;
                }

        },
        /*
       
        也可以这样写:

        public static final RED = new TrafficLamp()//因为枚举的构造函数是私有的,只能在本类实例化,写在这里就是在本类实例化
        {
                public TrafficLamp nextLamp()//这个是要实现的抽象方法
                {
                        return GREEN;
                }
        }

        */
        GREEN//这个和下面的所有对象都和上面的一样思路,可以那样写
        {
                public TrafficLamp nextLamp()
                {
                        return YELLOW;
                }
        },
        YELLOW
        {
                public TrafficLamp nextLamp()
                {
                        return RED;
                }

        };

        public abstract TrafficLamp nextLamp();//这个不是对象,是方法,抽象的,要在定义对象的时候实现。
}


评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
若还有问题,请继续追问;如果没问题了,请将帖子分类改成【已解决】~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马