1、介绍

Java5新增了一个enum关键字(它与class、interface关键字的地位相同),用以定义枚举类。

枚举类终究不是普通的类,它与普通类有如下区别:

  1. 枚举类不能显示继承其它类,枚举类可以实现一个或多个接口,使用enum定义的枚举类默认继承了java.lang.Enum类,而不是默认继承Object类。其中Enum类实现了Serializable和Comparable两个接口。
  2. 枚举类不能派生子类,使用enum定义、非抽象的枚举类默认会使用final修饰。
  3. 枚举类的构造器只能使用private访问控制符,如果省略了构造器的访问控制符,则默认使用private修饰。
  4. 枚举类的实例必须在枚举类的第一行显示列出,否则这个枚举类永远都不能产生实例。列出这些实例时,系统会自动添加public static final修饰,自动创建这些实例,无需程序员显示添加。
  5. 枚举类默认提供了一个values()方法,该方法可以很方便的遍历所有枚举值。

2、enum类java.lang.Enum

1、成员变量、构造方法

private final String name;  // 枚举常量的名称
private final int ordinal;  // 枚举常量的序数
protected Enum(String name, int ordinal) {
     = name;
    this.ordinal = ordinal;
}

2、主要方法

方法名

修饰符

返回值类型

说明

name()

public final

String

返回枚举常量的名称,和声明时的名称一致。即返回name。

ordinal()

public final

int

返回枚举常量的序数。即获取ordinal。

toString()

public final

String

和name()方法一致。

equals(Object other)

public final

boolean

判断指定对象和枚举常量是否相等。

hashCode()

public final

int

返回哈希编码。

compareTo(E o)

public final

int

比较枚举常量和指定对象的大小,通过ordinal进行比较。

getDeclaringClass()

public final

Class

返回与此枚举常量的枚举类型相对应的 Class 对象。

valueOf(Class enumType, String name)

public static

<T extends Enum> T

按指定名称返回其对应的枚举常量。

3、常见用法:

1、常量:

在JDK1.5 之前,我们定义常量都是: public static fianl.... 。现在有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。 

public enum Color {  
   RED, GREEN, BLANK, YELLOW  
}

 2、switch

JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。 

public enum Signal {  
    GREEN, YELLOW, RED  
}  

public class TrafficLight {  
    Signal color = Signal.RED;  
    public void change() {  
        switch (color) {  
            case RED:  
                color = Signal.GREEN;  
                break;  
            case YELLOW:  
                color = Signal.RED;  
                break;  
            case GREEN:  
                color = Signal.YELLOW;  
            break;  
        }  
    }  
}

3、向枚举中添加新方法、或 覆盖Enum枚举的方法

如果打算自定义方法,那么必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum 实例。 

public enum Color {  
    RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);  
    // 成员变量  
    private String name;  
    private int index;  
    // 构造方法  
    private Color(String name, int index) {  
         = name;  
        this.index = index;  
    }  
    // 普通方法  
    public static String getName(int index) {  
        for (Color c : Color.values()) {  
            if (c.getIndex() == index) {  
                return ;  
            }  
        }  
        return null;  
    }  
    // get set 方法  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
         = name;  
    }  
    public int getIndex() {  
        return index;  
    }  
    public void setIndex(int index) {  
        this.index = index;  
    }  

    //覆盖方法  
    @Override  
    public String toString() {  
        return this.index+"_"+;  
    }  
}

4、实现接口

所有的枚举类都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。

public interface Behaviour {  
    void print();  
    String getInfo();  
}  

public enum Color implements Behaviour{  
    RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);  
    
   // 成员变量  
    private String name;  
    private int index;  
    // 构造方法  
    private Color(String name, int index) {  
         = name;  
        this.index = index;  
    } 
 
    //接口方法  
    @Override  
    public String getInfo() {  
        return ;  
    }  

    //接口方法  
    @Override  
    public void print() {  
        System.out.println(this.index+":"+);  
    }  
}

5、使用接口组织枚举

public interface Food {  
    enum Coffee implements Food{  
        BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO  
    }  
    enum Dessert implements Food{  
        FRUIT, CAKE, GELATO  
    }  
}