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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张学东 中级黑马   /  2012-10-26 16:52  /  1696 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public enum TrafficLamp{
  2.           RED(30){
  3.                   public TrafficLamp nextLamp(){
  4.                           return GREEN;
  5.           }
  6.                   },
  7.           GREEN(45){
  8.                   public TrafficLamp nextLamp(){
  9.                           return YELLOW;
  10.           }
  11.                   },
  12.           YELLOW(5)
  13.           {
  14.                   public TrafficLamp nextLamp(){
  15.                           return RED;
  16.           }};
  17.           
  18.           public abstract TrafficLamp nextLamp();
  19.           private int time;
  20.           private TrafficLamp(int time){
  21.                   this.time=time;
  22.           }
  23.   }
  24.           }
复制代码
谁能帮我解释下这段代码啊

4 个回复

倒序浏览
RED(30){
                 public TrafficLamp nextLamp(){
                         return GREEN;
         }
RED这是一个枚举子对象,调用了父类型的有参数的构造方法,而且还实现了父类型的abstract方法。
枚举这玩意特殊,反正记着就行。

回复 使用道具 举报
枚举中每个元素都是该类的实例对象,该例中RED,GREEN,YELLOW都是该枚举类的对象,它们后面的(){}中内容是复写了构造方法,在类内部创建本类对象,所以每个元素都是该类对象
回复 使用道具 举报
这个解释起来比较复杂,先从一个简单的入手,要认真看
使用枚举是为了在项目中别人用到我自己写的一个类的对象时,只能使用我规定的那些值,避免发生错误.
        一先用一个普通类模拟枚举(以星期类WeekDay为例)
        1先创建一个普通类WeekDay
        public class WeekDay{
            private WeekDay(){} //构造函数一定要是私有的
        
            pvirate final static WeekDay SUN = new WeekDay();
            pvirate final static WeekDay MON= new WeekDay();
            //因为时间问题,就写了两个
        
            //因为WeekDay是自己定义的一个类,所以要打印时,就要覆盖toString()
            public String toString(){
            }
        
        }
        2在包含主函数的类中使用WeekDay
        public class TestEnum{
        
              public static void main(String args[]){
        
                    WeekDay weekday = WeekDay.MON;
                   //这样在main函数中使用weekday时,只能使用我定义好的那几个静态的值
               }

        }
以上是用普通的类来实现枚举,从这就可以看出枚举中的元素其实都是一个此类型的对象.
        二用关键字enum来创建枚举
        public class TestEnum{
        
              public static void main(String args[]){
        
                   WeekDay weekday = WeekDay.SUN;
               }
              //使用enum关键字创建枚举
              public enum WeekDay{
               SUN,MON,TUE,WED,THI,FIR,SAT;//分号可以写可以不写
             }
        }
        使用jdk写好枚举比我们自己写的要省事,并且还有一些方法供我们使用.
        三枚举类型的深入解析
        1在枚举中定义构造函数//从这要认真看,那个交通灯的例子用到了这种思想
        public class TestEnum {

          public static void main(String[] args) {
               
        Weekday weekday = Weekday.FIR;
        
        System.out.println(weekday);

        }
        
        public enum Weekday
        {
                SUN,MON,TUE,WED,THI,FIR,SAT;//在枚举中有其他方法时,分号必须写
               
                private Weekday()//枚举的构造方法必须是私有的,并且写在元素的后面
                {
                        System.out.println("first");
                }
                private Weekday(int day)
                {
                        System.out.println("second");
                }
        }
}
当程序执行时可以看到,枚举在实例化时用到的是没有参数的构造函数;如果想要使用带参数的构造函数就要修改枚举类型:
    public enum Weekday
        {
                SUN(1),MON(),TUE,WED,THI,FIR,SAT;
        }
这样在SUN实例化时就会使用带参数的构造函数,虽然MON带了括号,但是实例化时还是用的是不带参数的构造函数.
对于交通灯的那个例子,
RED(30){

03.                  public TrafficLamp nextLamp(){

04.                          return GREEN;

05.          }
RED(30)中RED是枚举TrafficLamp的一个子类对象,并用RED来表示此子类对象,它调用的是带参数的构造函数,因为RED,GREEN,YELLOW都是枚举TrafficLamp创建的子类对象,所以子类必须重写父类中的抽象方法
回复 使用道具 举报
这里枚举有三个元素:RED、GREEN、YELLOW ,
元素括号里的是构造函数的参数,他调用了构造函数TrafficLamp(int time)
花括号里面的是实现类中的抽象函数:nextLamp,返回的是TrafficLamp类型
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马