Java 之 枚举(Enum) 一、枚举 二、JDK1.5之前,实现枚举效果 三、JDK1.5之后使用枚举 四、枚举类型的特点  五、父类 java.lang.Enum 类型 六、枚举类型的优势

  1、概述

    枚举:JDK1.5引入的,类似于穷举,一一罗列出来

    Java 枚举:把某个类型的对象,全部列出来

    枚举类型的对象是有限、固定的几个常量对象。

  2、应用

    什么情况下会用到枚举类型?

    当某个类型的对象是固定的,有限的几个,那么就可以选择使用枚举。

    在整个系统的运行期间,有且只有这几个对象。

    例如: 性别类:只有两个对象:男,女

        季节类:有4个对象:春、夏、秋、冬

二、JDK1.5之前,实现枚举效果

  1、需要把构造器私有化:

      目的:在这个类的外面,无法随意的创建对象

  2、在本类中,提前创建好对象,供别人使用

      Demo:

 1 public class TestEnum {
 2     public static void main(String[] args) {
 3         //Gender g1 = new Gender();   构造器私有化,无法使用
 4         
 5         Gender nan1 = Gender.NAN;
 6         Gender nan2 = Gender.NAN;
 7         System.out.println(nan1 == nan2);//true
 8     }
 9 }
10 class Gender{
11     //public:使得外面可以直接访问
12     //static:使得可以使用“类名.”访问
13     //final:前调这个对象是不可变
14     public static final Gender NAN = new Gender("男");
15     public static final Gender NV = new Gender("女");
16     
17     private String description;
18     
19     private Gender(String description){
20         this.description = description;
21     }
22 }

三、JDK1.5之后使用枚举

  1、定义格式

    (1)声明枚举类型

【修饰符】  enum 枚举类型名{
    常量对象列表
}

    (2)声明枚举类型2

【修饰符】  enum 枚举类型名{
	常量对象列表;
	其他的成员列表
}

             说明

      ① 常量对象列表必须在枚举类型的首行;

      ② 如果常量对象列表后面还有其他的成员,那么需要在常量对象列表后面加 ;进行分割。

  2、枚举

    (1)枚举是一种类,是一种特殊的类,特殊在它的对象是有限的几个常量对象。

    (2)枚举类型不能继承其他类型,因为枚举类型有一个隐含的父类

       java.lang.Enum 是所有 Java 语言枚举类型的公共基本类。

  3、常用方法

    (1)构造方法

        Enum 类中有一个唯一的构造器

protected  Enum(String name, int ordinal) 

         这个构造器不是程序员手动调用的,是编译器自动调用,在所有枚举类型的构造器的首行,并且自动传入 name 和 ordinal 的值。

        name:表示常量对象名称

        ordinal:表示常量对象的序号,其中初始常量序数为零

    (2)name() 与 ordinal() 方法

String name():返回 常量对象名称
int ordinal():返回 常量对象序数,即获取某个枚举对象的位置索引值,索引从0开始

    (3)toString() 方法

String toString():在Enum类中重写了Object类的toString方法,返回常量对象名

      自定义的枚举类型,eclipse不能自动生成 toSring 方法,但是可以手动重写。因为IDE认为,父类的 toString方法已经很完美了。

    (4)values() 与 valueof() 方法

枚举类型[] values():返回该枚举的所有枚举对象
枚举类型   valueOf(String name):根据name常量对象名返回枚举对象

     (5)compareTo() 方法

枚举对象.compareTo()  该方法用于比较两个枚举对象在定义时的顺序

      返回正值:代表方法中参数在调用该方法的枚举对象位置之前

       返回零:代表两个互相比较的枚举成员的位置相同

       返回负值:代表方法中参数在调用该方法的枚举对象位置之后

  

    Demo:

 1 public class TestEnum {
 2     public static void main(String[] args) {
 3         Season s = Season.SPRING;
 4         System.out.println(s);//自动调用toString
 5         
 6         System.out.println(s.name());
 7         System.out.println(s.ordinal());
 8         System.out.println("-----------------");
 9         
10         Season[] all = Season.values();  //获取所有枚举对象
11         for (int i = 0; i < all.length; i++) {
12             System.out.println(all[i]);
13         }
14         
15         System.out.println("-----------------");
16         Season spring = Season.valueOf("SPRING");
17         System.out.println(spring);
18     }
19 }
20 enum Season{
21     //常量对象后面没有(值)就是调用无参构造
22     //常量对象后面有(值)就是调用有参构造
23     SPRING("春暖花开"),SUMMER,FALL,WINTER;
24     
25     private String description;
26 
27     private Season() {
28         
29     }
30 
31     private Season(String description) {
32         this.description = description;
33     }
34     // 手动重写 toString() 方法
35     public String toString(){
36         return name() + ":" + description;
37     }
38     
39 }

四、枚举类型的特点

  1、枚举类型有一个公共的基本的父类,是 java.lang.Enum 类型,所以不能再继承别的类型

  2、枚举类型的构造器必须是私有的

  3、枚举类型可以实现接口

         枚举实现接口要重写所有的抽象方法,所有对象可以都调用通用的重写方法,也可以调用各自重写的方法。

   Demo:

 1 public class TestEnum {
 2     public static void main(String[] args) {
 3         MyEnum a = MyEnum.A;
 4         a.test();
 5         
 6         MyEnum b = MyEnum.B;
 7         b.test();
 8     }
 9 }
10 interface MyInter{
11     void test();
12 }
13 enum MyEnum implements MyInter{       //每个对象各自重写方法
14     A{
15         @Override
16         public void test() {
17             System.out.println("aaa");
18         }
19     },B{
20         @Override
21         public void test() {
22             System.out.println("bbb");
23         }
24     }
25 }
26 enum MyEnum1 implements MyInter{     //通用的方法
27     A,B;
28 
29     @Override
30     public void test() {
31         System.out.println("test");
32     }
33 }

 五、父类 java.lang.Enum 类型

  1、构造器

protected Enum(String name, int ordinal):由编译器自动调用

  2、String name(): 常量对象名

  3、int ordinal(): 返回常量对象的序号,第一个序号是0

  4、String toString(): 返回常量对象名,如果子类想重写,需要手动重写

  5、int compareTo(Object obj): 按照常量对象的顺序比较

六、枚举类型的优势

    •   类型安全
    •     紧凑有效的数据定义
    •     可以和程序其他部分完美交互
    •     运行效率高