枚举
2018-12-07 本文已影响0人
平头哥2015
从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()方法比较枚举常量和其他对象是否相等。只有当两个对象都引用同一个枚举中相同的常量时,它们才相等。