当一个变量有几种可能的取值时就可以将它定义为一个枚举的类型,枚举可以看做一种比较特殊的类(貌似有的地方直接称作枚举类),为什么这么说呢?因为枚举可以像类一样,可以包含构造函数、静态的属性或者方法、抽象函数等;
为什么要使用枚举类型呢?
很多时候,我们在使用一个参数的时候,这个参数的取值在一个已知的范围内,如星期,只能取星期一、星期二......星期天,把星期声明为一个枚举类型,首先方便管理,另外更重要的一点就是,当使用枚举类型作为一个方法的返回值的时候,返回值不能超出枚举类型定义的范围。
看一段代码:
package com.testenum;
public class Demo {
public static void main(String[] args) {
//像类一样通过点运算符获取枚举类型中的元素
ColorEnum colorEnum = ColorEnum.blue;
System.out.println(colorEnum);
//下面的这种写法跟上面的意思一样
ColorEnum colorEnum1 = ColorEnum.valueOf("blue");
System.out.println(colorEnum1);
ColorEnum colorEnum2 = ColorEnum.valueOf(ColorEnum.class, "blue");
System.out.println(colorEnum2);
// 遍历枚举,values方法返回枚举类型中的元素组成的数组
for (ColorEnum color : ColorEnum.values()) {
System.out.println(color);
}
// 获取枚举的个数
System.out.println("ColorEnum枚举中的值有" + ColorEnum.values().length + "个");
// 获取枚举的索引位置,默认从零开始
System.out.println(ColorEnum.red.ordinal());
System.out.println(ColorEnum.green.ordinal());
System.out.println(ColorEnum.yellow.ordinal());
System.out.println(ColorEnum.blue.ordinal());
// 枚举默认实现了java.lang.Comparable接口,可以对枚类型的元素进行比较,
//比较的是索引顺序,red的索引位置小于green,所以此处打印出-1
System.out.println("比较结果为:"+ColorEnum.red.compareTo(ColorEnum.green));
//调用枚举类型中的public的方法
System.out.println("季节为:" + SeasonEnum.getSeason());
//枚举类型中的构造函数,此处在实例化Gender对象的时候就调用了Gender中的构造函数,
//实例化了两个Gender对象,调用了两次构造函数,传递进去的参数分别是"MAN"、"WOMAN"
for (Gender gender : Gender.values()) {
System.out.println(gender.value);
}
//调用枚举类型中的抽象方法
System.out.println(OrderState.CANCEL.getName());
}
}
/**
* 下面是四钟常见的枚举类型,用来定义变量,在定义的同时也限制了变量的取值
* 赋值的时候通过“枚举名.值”取得枚举中的值
*/
//1、普通枚举类,包含有四个元素
enum ColorEnum {
red, green, yellow, blue;
}
//2、包含有静态方法和属性的枚举类型
enum SeasonEnum {
// 注:枚举类型要写在最前面,否则编译的时候会出错 所有的枚举类型都是publi final static的
spring, summer, autum, winter;
private final static String position = "test";
public static SeasonEnum getSeason() {
if ("test".equals(position))
return spring;
else
return winter;
}
}
//3、带有构造函数的枚举类型
enum Gender {
// 通过括号赋值,而且必须带有一个参数构造器和一个属性跟方法,否则编译的时候会出错
// 赋值必须都赋值或者都不赋值,如果不赋值则不能写构造器
MAN("MAN"), WOMEN("WOMEN");
final String value;
// 构造器默认也只能是private,从而保证构造函数只能在内部使用,
//防止在外部实例化一个枚举类型(默认是private的)
Gender(String value) {
this.value = value;
}
}
//4、实现了抽象方法的枚举类
enum OrderState {
CANCEL {
public String getName() {
return "已取消";
}
},
WAITCONFIRM {
public String getName() {
return "待审核";
}
},
WAITPAYMENT {
public String getName() {
return "等待付款";
}
};
// 声明一个抽象的方法,抽象方法实现在枚举类型中
public abstract String getName();
}
打印结果:
blue
blue
blue
red
green
yellow
blue
ColorEnum枚举中的值有4个
0
1
2
3
比较结果为:-1
季节为:spring
MAN
WOMEN
已取消
需要注意的是,既然枚举类型跟普通的类比较类似,普通类中的属性可以被修改,那么枚举类型中的属性值能不能被修改呢?
看这段代码:
public class Demo {
public static void main(String[] args) {
ColorEnum colorEnum1 = ColorEnum.blue;
System.out.println(colorEnum1);
ColorEnum colorEnum2 = ColorEnum.red;
colorEnum1 = colorEnum2;
System.out.println(colorEnum1);
}
}
enum ColorEnum {
red, green, yellow, blue;
}
枚举类型中的元素只能被修改为该元素所在的枚举类型中的其他的元素,不能被被修改为其他枚举类型中的元素,
能不能通过new来实例化一个枚举类型呢?试了一下,貌似不能。