1、什么是枚举?
枚举就是要让某个类型的变量的取值只能为若干固定值中的一个,否则编译会报错。枚举可以让编译器在编译时就可以控制
源程序赋给的非法值,使普通变量的方式在开发阶段无法实现这一目标。
2、认识Java中的枚举类
Java中用enum关键字修饰枚举类,下面定义一个简单的枚举类
/**
* 枚举类型
*/
public enum Color {
RED,GREEN,BLUE;
}
类中的RED,GREEN,BLUE就是枚举类型为Color的对象,我们可以通过类名引用它们。
@Test
public void testEnum1(){
Color colorEnum=Color.RED;
System.out.println(colorEnum);//输出枚举对象的名
System.out.println(colorEnum.name());//枚举对象的名
System.out.println(colorEnum.compareTo(Color.BLUE));//枚举对象的比较
System.out.println(colorEnum.ordinal());//枚举的象的序号
System.out.println(colorEnum.toString());//打印对象名
}
输出结果:
3、集合对枚举的支持
在JDK1.5以后,增加了EnumSet,EnumMap集合对枚举进行支持。可以将枚举类中定义的对象封装成集合的形式,但不常用。
@Test
public void testEnum2(){
//将枚举中定义的对象封装成集合
EnumSet<Color> colors=EnumSet.allOf(Color.class);
//遍历
for(Color color:colors){
System.out.println(color);
}
}
EnumMap<Color,String> colorMap=new EnumMap<Color, String>(Color.class);//转换成Map集合
colorMap.put(Color.RED,"red");
4、带构造方法的枚举
在枚举中的构造方法必须是private类型的,类中页可以定义属性。
可以在定义枚举对象时,传入属性的值,调用属性的值和一般对象一样(对象名.属性名)。
/**
* 枚举类型
*/
public enum Color {
RED(10),GREEN(20),BLUE;
private int colorValue;
private Color(){}
private Color(int colorValue) {
this.colorValue = colorValue;
}
}
5、枚举实现接口
与一般类一样,枚举类也可以实现接口。
/**
* 接口类
*/
public interface Info {
public int getColor();
}
/**
* 枚举类型
*/
public enum Color implements Info{
RED(10),GREEN(20),BLUE;
private int colorValue;
private Color(){}
private Color(int colorValue) {
this.colorValue = colorValue;
}
@Override
public int getColor() {
return colorValue;
}
}
6、枚举类中定义抽象方法
**
* 枚举类型
*/
public enum Color implements Info{
RED(10) {
@Override
public String getColorValue() {
return "red";
}
},GREEN(20) {
@Override
public String getColorValue() {
return "green";
}
},BLUE {
@Override
public String getColorValue() {
return "blue";
}
};
private int colorValue;
private Color(){}
private Color(int colorValue) {
this.colorValue = colorValue;
}
@Override
public int getColor() {
return colorValue;
}
/**
* 抽象方法
* @return
*/
public abstract String getColorValue();
}
7、总结
枚举类具有如下特性:
1) 枚举类是一种特殊形式的 Java 类。
2) 使用 enum 定义的枚举类默认继承了 java.lang.Enum 类
3) 枚举类中声明的每一个枚举值代表枚举类的一个实例对象。
4) 与 Java 中的普通类一样,在声明枚举类时,也可以声明属性、方法和构造函数,但枚举类的构造函数必须为私有的。
5) 枚举类的所有实例必须在枚举类中显式列出(, 分隔 ; 结尾). 列出的实例系统会自动添加 public static final 修饰
6) 枚举类也可以实现接口、或继承抽象类。
7) JDK5 中扩展了 swith 语句,它除了可以接收 int, byte, char, short 外,还可以接收一个枚举类型。