java 1.5引入的一个新特性,其本质是一个final修饰的类,继承自Enum,不可被继承。
特点
- 枚举类用关键字enum修改,本质是类
- 定义的枚举类继承自java.lang.Enum,且无法被继承
- 私有的构造方法,不能通过new直接创建实例,只能定义出实例
- 枚举类中写的都是成员变量,被final和static修改,默认的,不用写
- 枚举类是一种引用类型,引用类型通常用equals()比较,但枚举类例外,既可以用equals(),也可以使用 ==。这是因为枚举类型的每一个常量在JVM中只有一个唯一的实例,可以直接用 == 比较。
- 可以将enum类型用于switch语句
枚举类
定义一个枚举类,如下
public enum Number {
ONE,TWO,THREE;
}
编译器编译处的class类似下面这样
public class Number{
public static final Number ONE = new Number();
public static final Number TWO = new Number();
public static final Number THREE = new Number();
private Number(){}
}
默认方法
name()
返回常量名称,不可重写。例如:
String str = Number.ONE.name(); // 'ONE'
ordinal()
返回定义的常量的顺序,从0开始计数。改变枚举常量定义的顺序会导致ordinal()返回值的变化。例如:
int n = Number.ONE.ordinal(); // 0
toString()
返回常量名称,可被重写。例如:
public enum Number {
ONE,TWO,THREE;
@Override
public String toString() {
return "NONE";
}
}
// 重写前
String str = Number.ONE.toString(); // 'ONE'
// 重写后
String str = Number.ONE.toString(); // 'NONE'
构造方法
枚举类可以定义私有的构造方法,可以通过定义构造方法来为每个定义实例增加别名。
public enum Number {
ONE(1),TWO(2),THREE(3); // 枚举类常量,定义的实例
public int value; //枚举类的字段,可final修饰,也可不用
private Number(int value){
this.value = value;
}
public static void main(String[] args) {
int num = Number.ONE.value;
System.out.println("value = " + num);
}
}
// 输出:value = 1
switch应用
public static void main(String[] args){
Number item = Number.ONE;
switch(item){
case ONE:
System.err.println(Number.ONE.value);
break;
case TWO:
System.err.println(Number.TWO.value);
break;
case THREE:
System.err.println(Number.THREE.value);
break;
default:
System.err.println("NONE");
}
// 输出:value = 1