黑马程序员——枚举

----------------- android培训java培训、期待与您交流! -----------------

枚举

1,枚举存在的意义。

当要定义星期几或性别的变量,该怎么定义。假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday=0;

枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时候就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这个目标。

 

2,用普通类模拟枚举的实现原理。

package enum_test;

 

//模拟枚举

public abstract class WeekDay {

    private WeekDay() {

    }

//把复杂的if else 语句抽象成两个匿名内部类。记住这个思想。

    public final static WeekDay SUN = new WeekDay(){

       @Override

       public WeekDay nextDay() {

           return MON;

       }

    };

    public final static WeekDay MON = new WeekDay(){

       @Override

       public WeekDay nextDay() {

           return SUN;

       }

      

    };

//用抽象方法定义nextDay就将大量的 if else 语句转移成了一个个独立的类。

    public abstract WeekDay nextDay() ;

//     if (this == SUN) {

//         return MON;

//     } else {

//         return SUN;

//     }

 

 

    public String toString() {

       return this == SUN ? "SUN" : "MON";

    }

}

 

3,枚举的应用,构造方法和抽象方法。

package enum_test;

public class Enum {

    public static void main(String[] args) {

       WeekDay day = WeekDay.MON;

       System.out.println(day.nextDay());

    }

 

    public enum Demo {

       // 元素列表必须位于所有的成分之前。每个元素都是一个类。

       SUN, MON, TUE, WED, THI, FRI, SAT;

       // 对于枚举的构造方法只能是私有的。

       // 元素列表中没有写任何参数时候,默认调用无参构造。

       // 如果想调用带参构造,需要加入参数。例:SUN(1);

       private Demo() {

 

       }

 

       private Demo(int day) {

 

       }

 

    }

   

    public enum TrafficLamp{

//  new子类的实例对象,调用父类的有参构造方法。

       RED(30){

           @Override

           public TrafficLamp nextLamp() {

              return GREEN;

           }

          

       },

       GREEN(40){

 

           @Override

           public TrafficLamp nextLamp() {

              return YELLOW;

           }

          

       },

       YELLOW(5){

           @Override

           public TrafficLamp nextLamp() {

              return RED;

           }

          

       };

//     定义一个抽象方法。方法的返回类型可以是类本身。

       public abstract TrafficLamp nextLamp();

       private int time ;

      

       private TrafficLamp(int time){

           this.time = time;

       }

    }

//  枚举只有一个成员时候,就可以作为一种单例的实现方式。

}

 

 

你可能感兴趣的:(程序员)