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); 
 
 
 

   }