1、为什么要出现枚举:


(例如:月份只有1~12月,性别只有男女,季节只有四季……等)


若将其类型定义成常量,则不可避免地出现非法参数的问题 (例如:13月,第三个性别,第五个季节……等)


因此,对于上述类型的对象,必须规定其特定的属性值为枚举类型,即:仅能从已有的几个值中挑选,不可以自己创建新的属性值


 


2、枚举的关键概念:


用户若想要创建某个对象


只能从已有的该类型对象里面 挑选


不能自己 自由创建 新的该类型对象


例如:用户若想要一个季节类型的对象


则只能从已有的春夏秋冬四个类型的对象里挑选


而不能创建新的季节类型对象


 


*枚举类的原始实现:


(1)定义一个类,里面包含若干个public static final修饰的,自身类型的变量以供外界使用


(2)构造方法私有(即:不可以由外界创建新的对象)


例如:


class Season() { 

 

    public static final Season SPRING = new Season(); 

 

    public static final Season SUMMER = new Season(); 

 

    public static final Season AUTUMN = new Season(); 

 

    public static final Season WINTER = new Season(); 

 
private Season() {}
 

  }


 


*这样,外界只要把一个变量定义成Season类


那么这个变量除了取春夏秋冬中任一个值外,不能取任何其它值


 


3、枚举类在JDK5.0中的实现:


enum Season() {SPRING,  SUMMER,  AUTUMN,  WINTER}


编译器 语法,即:


编译器在遇到上述语句的时候,会自动将其转换成之前原始实现的格式


*因此,枚举在本质上仍然是一个特殊的类,只不过这个类:


(1)内部包含该类的公开静态常量对象


(2)构造方法必须是私有的




4、枚举类的父类:Enum


常用方法:


values()  //静态方法,返回该枚举类的数组,内容为该类中所有的枚举值


 


5、枚举类作为一个特殊的类的理解:


枚举除了可以定义该类的公开静态常量对象之外


还可以定义任何另外的属性和方法,


在枚举值的最后一个值后面加上分号


例如:


enum Season() { 

 

    SPRING("春天"),  

 

    SUMMER("夏天"),  

 

    AUTUMN("秋天"),  

 
;
 

 
   
 String name;
 

    Season(String name) {this.name = name}


注意:枚举类的构造方法仅能是private的,即使不用private修饰,也会自动默认为private


public String getName() {return name;} 

 

  }

 


6、枚举类不可以有子类,但是枚举类中的枚举值可以实现枚举类中的抽象方法


例如:


 


//定义枚举类型
 

  enum Operator { 

 

    ADD { 

 

      public calculate(double a, double b) { 

 

        return a+b; 

 

      } 

 

    }, 

 

       public calculate(double a, double b) { 
 
 
 

         return a-b; 
 
 
 

       } 
 
 
 

     }, 
 
 

       public calculate(double a, double b) { 
 
 
 

         return a*b; 
 
 
 

       } 
 
 
 

     }, 
 
 

       public calculate(double a, double b) { 
 
 
 

         return a/b; 
 
 
 

       } 
 
 
 

     }; 
 
 

    public abstract double calculate(double a, double b); 

 

  } 

 

    

 
//调用该枚举类
 

  Operator [] os = Operator.values(); 

 

  for(Operator o:os) { 

 

    o.calculate(8,2); 

 

  }