枚举的作用就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段 无法实现这一目标。
使用枚举可以限制取值范围、提高代码的可读性、便于维护。
- 使用enum声明枚举,枚举默认直接继承了java.lang.Enum类,而不是 Object 类;
- 因为枚举已经继承了java.lang.Enum类,所以它无法再继承其他类。
- 枚举类的对象是固定的,实例个数有限,不可以再new( ),枚举对象后可以跟()。
- 枚举元素必须位于枚举类体中的最前面,枚举元素之间使用逗号分隔。
- 枚举类的构造方法的访问控制符默认是private,不能使用其他修饰符。
- 一旦枚举对象后面加上{},那么该对象实际是枚举匿名内部类对象;
- 所有枚举类都提供一个静态的values()方法(返回该枚举类所有对象组成的数组),便于遍历所有枚举对象;
- 所有枚举类都提供一个静态的valueOf(String name)方法, 返回枚举类中对象名等于name的对象。
枚举的声明格式:enum 枚举名称{枚举元素1,枚举元素2,…,枚举元素N; }
例如:enum enumDemo {SPRING, SUMMER, AUTUMN, WINTER;}
枚举最简单的使用方法,使用switch循环设置每个枚举元素所对应的返回信息。
enum enumDemo {
SPRING, SUMMER, AUTUMN, WINTER;
public String toString() {
String name = null;
switch (this) {
caseSPRING:
name = “春”;
break;
caseSUMMER:
name = “夏”;
break;
caseAUTUMN:
name = “秋”;
break;
caseWINTER:
name = “冬”;
break;
}
return name;
}
}
执行:System.out.println(enumDemo.WINTER.toString()); //打印结果:冬
在枚举内定义抽象方法,如果枚举内定义了抽象方法,则需要让这个枚举内的所有枚举元素都实现这个抽象方法,否则编译不通过:
enum enumDemo1 {
SPRING {
@Override
public String show() {
return"春";
}
},
SUMMER {
@Override
public String show() {
return"夏";
}
},
AUTUMN {
@Override
public String show() {
return"秋";
}
},
WINTER {
@Override
public String show() {
return"冬";
}
};
publicabstract String show();
}
执行:System.out.println(enumDemo1.SUMMER.show());//打印结果:夏
如果要为每个枚举值指定属性,则必须声明一个参数个数和类型和枚举值类型对应的构造器,否则编译不通过:
enum enumDemo2 {
SPRING(“春”), SUMMER(“夏”), AUTUMN(“秋”), WINTER(“冬”);
private String name;
enumDemo2(String name) {
this.name = name;
}
public String getEnumNmae() {
returnthis.name;
}
}
执行:System.out.println(enumDemo2.AUTUMN.getEnumNmae());//打印结果:秋
枚举实现接口有两种写法:一种是直接在枚举内实现,还有一种是把枚举元素变成枚举匿名内部类,然后在这个枚举匿名内部类中实现:
//第一种:直接在枚举内实现
enum enumDemo3 implements A {
SPRING(“春”), SUMMER(“夏”), AUTUMN(“秋”), WINTER(“冬”);
private String name;
enumDemo3(String name) {
this.name = name;
}
@Override
public String getName() {
returnthis.name;
}
}
//第二种:在枚举匿名内部类中实现
enum enumDemo4 implements A {
SPRING {
@Override
public String getName() {
return"春";
}
},
SUMMER {
@Override
public String getName() {
return"夏";
}
},
AUTUMN {
@Override
public String getName() {
return"秋";
}
},
WINTER {
@Override
public String getName() {
return"冬";
}
};
}
执行:System.out.println(enumDemo3.SPRING.getName());// 打印结果:春
执行:System.out.println(enumDemo4.SPRING.getName());// 打印结果:春
总结:可以将枚举理解为一个普通类,可以在它里面定义构造器,定义变量,定义方法,也可以定义抽象方法,还可以实现一个或多个接口,它和普通类的区别就是普通类可以new,而枚举不可以new,并且枚举中的构造器会被强制私有化。