黑马程序员技术交流社区

标题: 大家帮忙理解下这下枚举,实在有点糊! [打印本页]

作者: 左华清    时间: 2012-2-24 15:39
标题: 大家帮忙理解下这下枚举,实在有点糊!
本帖最后由 左华清 于 2012-2-24 19:42 编辑

public enum TrafficLamp{
                RED(30){
                        public TrafficLamp nextLamp(){
                                return GREEN;
                        }
                },GREEN(45){
                        public TrafficLamp nextLamp(){
                                return YELLOW;
                        }
                },YELLOW(5){
                        public TrafficLamp nextLamp(){
                                return RED;
                        }
                };
               
                public abstract TrafficLamp nextLamp();
                private int time;
                private TrafficLamp(int time){
                        this.time=time;
                }
        }

enum 相当一个类,RED,GREEN,YELLOW,相当于这个类的三个对象,
然后enum有一个带一个参数的构造函数,能这么理解吗,

抽象方法,内部类这个是怎么回事?
作者: 马胜平    时间: 2012-2-24 15:55
本帖最后由 马胜平 于 2012-2-24 16:02 编辑

枚举里面实例后面的花括号部分实际上就是一个类体部分,在这种情况下当创建枚举值时
并不是直接创建枚举类的实例,而是相当于创建了枚举类的匿名子类的实例,那对花括号是匿名内部类的类体
作者: 雷楚光    时间: 2012-2-24 16:05
本帖最后由 雷楚光 于 2012-2-24 16:07 编辑

你的理解错了。
首先enum 相当一个类,RED,GREEN,YELLOW,相当于这个类的子类三个对象。
因为该类有抽象方法,所以必须用子类继承这个类把它的抽象方法实体化。这样才能建立对象。

再由于enum有私有构造函数,那么它就必须在内部建立类。

于是就有:
1.创建子类,用子类去实体化抽象方法。
2.枚举的必须是对象(枚举的构造函数都是私有的),由于有抽象方法又不能建立自己的对象,那么就必须用子类去继承它,再建立子类的对象。
于是就有:建立子类对象就要把把父类的的抽象方法实体化,而只能在内部建立对象。于是必须用内部类。

作者: 雷楚光    时间: 2012-2-24 16:10
简单点说就是:
1.必须再内部建立对象。
2.建立对象又必须把抽象方法实体化。
所有必须在内部建子类,再建立子类对象。
作者: dangfei    时间: 2012-2-24 16:21
enum 相当于特殊的类,RED,GREEN,YELLOW相当于TrafficLamp的子类,这三者的实现要调用TrafficLamp的有参构造函数,也要实现TrafficLamp的抽象(abstract) 方法。
作者: 左华清    时间: 2012-2-24 19:41
谢谢各位!
作者: 黄方    时间: 2012-2-25 19:24
enum是一个类,你可以看看API
作者: 黄方    时间: 2012-2-25 21:52
本帖最后由 舞动的心弦 于 2012-2-25 21:53 编辑

public class CollectionForLoop{

       enum MySeasonEnum{spring, summer, fall, winter}

       public static void main(String[] args) {

              for(MySeasonEnum season : MySeasonEnum.values())

              {

                     System.out.println("The season is now " + season);

              }

       }

}

这个问题和我昨天注册论坛看到的交通灯问题类似!你看看这个例子吧




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