枚举

从JDK 5开始,枚举被添加到Java语言中。在Java中,枚举被定义为类,可以具有构造函数,方法以及实例变量。

基础知识

枚举的声明

创建枚举需要使用关键字enum,例如:

public enum Fruit {

    APPLE, BANANA, ORANGE, PEACH

}

APPLE, BANANA等称为枚举常量,这些常量被隐式地声明为public static final成员,并且都是Fruit类型(自类型化)。

枚举的特点

枚举虽然被定义为类,但是不能通过new来实例化枚举。枚举变量的声明和使用在许多方面与基本类型相同。

  • 枚举变量只能被赋值为在该枚举类型中定义的枚举常量。
Fruit fruit = Fruit.APPLE;
  • 可以使用关系运算符“==”比较两个枚举对象是否相等。
fruit == Fruit.BANANA;
  • 枚举值也可以用于控制switch语句。
switch (fruit) {
    case APPLE:
        // ...
    case BANANA:
        // ...
}

注意:在case语句中,枚举常量没有使用枚举类型进行限定,这是因为switch表达式中的枚举类型已经隐式指定了case常量的枚举类型。

  • 枚举常量的toString()方法返回常量的名称。
System.out.println(Fruit.BANANA); // BANANA

预定义方法

所有枚举都自动包含两个预定义方法:values()和valueOf()。

values方法

values()返回包含枚举常量列表的数组。一般形式如下:
public static enum-type[] values()

例子

Fruit[] fruits = Fruit.values();
for (Fruit fruit : fruits) {
    System.out.println(fruit);
}

valueOf方法

valueOf()返回传入的字符串参数对应的枚举常量。一般形式如下:
public static enum-type valueOf(String name)

例子

Fruit fruit = Fruit.valueOf("ORANGE");
System.out.println(fruit); // ORANGE

枚举是类类型

虽然不能用new实例化枚举,但是枚举却有许多和其他类相同的功能,比如枚举可以有构造函数、实例变量和方法,甚至可以实现接口。

public enum Fruit {

    APPLE(10), BANANA(1), ORANGE(2), PEACH;

    private int price;

    Fruit() {
        price = 8;
    }

    Fruit(int price) {
        this.price = price;
    }

    public int getPrice() {
        return price;
    }

}

虽然枚举是类类型,但是枚举有两条限制使得它不能扩展。

  • 枚举不能继承其它类。
  • 枚举不能被其它类继承。

枚举继承自Enum类

尽管声明枚举时不能继承其它类,但是所有枚举都自动继承父类java.lang.Enum。这个类定义了所有枚举都可以使用的一些方法。

  • name()方法获取枚举常量的名称。
  • ordinal()方法获取枚举常量在常量列表中的位置的值,称为枚举常量的序数值。序数值从0开始。
  • compareTo()方法比较相同类型的两个枚举常量的序数值。
  • equals()方法比较枚举常量和其他对象是否相等。只有当两个对象都引用同一个枚举中相同的常量时,它们才相等。

你可能感兴趣的:(枚举)