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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ~IN_HAND~ 中级黑马   /  2013-11-6 14:06  /  1926 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

下面的这个程序是看了张孝祥老师讲的枚举视频中的,是一个用枚举来模拟的红绿灯的程序。但是有一点我始终是没搞太明白,先看看代码:
class LampTest
{
        public static void main(String[] args)
        {
                Lamp la1 = Lamp.GREEN;
                System.out.println(la1.nextLamp());
        }
}
enum Lamp
{
        GREEN(30)
        {
                public Lamp nextLamp()
                {
                        return YELLOW;
                }
                       
        },
        YELLOW(3)
        {
                public Lamp nextLamp()
                {
                        return RED;
                }
        },
        RED(35)
        {
                public Lamp nextLamp()
                {
                        return GREEN;
                }
        };
        public abstract Lamp nextLamp();
        private int time;
        private Lamp(int time)
        {
                this.time = time;
        }
        public String toString()
        {
                if(this==GREEN)
                        return "green";
                else if(this==RED)
                        return "red";
                else
                        return "yellow";
        }
}


我不明白的是,像程序中的GREEN(30)、YELLOW(3)、RED(35)他们都是作为Lamp的子类吗?
还有他们中的nextLamp方法,就是相当于子类复写父类的方法?是不?他们3个算是内部类吗?
enum Lamp类中的public abstract Lamp nextLamp();这个既然是抽象方法,那么类名前不需要abstract修饰吗?

对于这些,在视频中听的有点晕了。。。。我很疑惑,求助!!!!

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

4 个回复

倒序浏览
^_^  当初我也是很晕头转向的,后来百度了下又问了下人。
1.你要把枚举看成是一个特殊的类,它有自己的类型enum,
   我们程序中使用的enum其实就是如同class一样,所以它是一个特殊的类,
   它本身就是一个抽象类,方便我们可以自定义抽象方法。
   因为我们在其中直接实现了自定义抽象方法,所以外部不需要写abstract关键字。
2.枚举中的元素定义方式也很特殊,形式上类似于匿名内部类,实际上却也不同,
  我们可以参照理解,但不能将它和匿名内部类划上等号。
  通过模拟枚举可以看到实际上GREEN(){}是通过一下方式简化来的:
  private static final Lamp GREEN = new Lamp(){};
  这个缩写方式比较特别,相当于给匿名内部类对象起了个名字,是一种新的方式只适用于枚举,
  我目前没有见过在其他方面的。格式:枚举名(构造方法){可实现的方法,不止是抽象},
  所以可以说实现抽象方法的枚举元素就是这个枚举类的子类对象,方法可以覆盖也可以实现。
3.通过上述也可以知道枚举的调用了,直接使用枚举名.枚举元素。
   我们平时直接使用的枚举是封装起来的,
   很多东西都隐匿起来了。
这些很多是我自己理解的,可能不是很权威,你就当帮助理解好了。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 李慧声 于 2013-11-6 17:16 编辑

显然楼主前两行中的答案应该是YES,不然怎么会和类一模一样呢?

其实吧 楼主,你想想接口是怎么一回事就不难理解枚举了.
接口里面的方法全是abstract的,那也没有见在接口前面加一个abstract的,就是一种规定么,你想想,既然已经知道了所有的enum都是抽象的了,那干嘛前面还要写一个abstract呢?这是人家一种的省略嘛,为了和普通的class区别嘛,然后把class给换成enum了。想想也就这样了,不然为啥enum都具备类的那些功能呢,你说是吧?

就是说sun公司设计了种种格式,为了便捷的封装不同类型的数据,有class,enum,interface,annotation等等。。。
张老师不是在前面用抽象类模拟过枚举是怎么回事吗?enum不就是简化了书写格式而已嘛!
希望对楼主有用~

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
doitforyou 发表于 2013-11-6 14:31
^_^  当初我也是很晕头转向的,后来百度了下又问了下人。
1.你要把枚举看成是一个特殊的类,它有自己的类型 ...

谢谢你的详细解答!重新看了一遍视频,感觉心里有点谱了
回复 使用道具 举报
李慧声 发表于 2013-11-6 17:14
显然楼主前两行中的答案应该是YES,不然怎么会和类一模一样呢?

其实吧 楼主,你想想接口是怎么一回事就不 ...

谢啦!哈,也许需要点时间来消化。心里有点谱了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马