枚举是什么:
JAVA枚举类是一种特殊的类型,父类都是java.lang.Enum。他的特殊性来自于他既是类型,又比一般的类型多了些约束,使用起来简洁、便捷、安全。其中的每个值都是一个个枚举常量单例。
JAVA枚举的创建:
枚举常数由枚举类加载入虚拟机时创建,并且是唯一。通过枚举类与反编译后的枚举类对比可知枚举类与其中的枚举值本质。
枚举类使用示例:
1、简单枚举类示例:
简单枚举类的创建:
//定义枚举类型
enum Day {
MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
反编译简单枚举类的class文件:
//反编译Day.class
final class Day extends Enum
{
//编译器为我们添加的静态的values()方法
public static Day[] values()
{
return (Day[])$VALUES.clone();
}
//编译器为我们添加的静态的valueOf()方法,注意间接调用了Enum也类的valueOf方法
public static Day valueOf(String s)
{
return (Day)Enum.valueOf(com/test/pojo/Day, s);
}
//私有构造函数
private Day()
{
super();
}
//前面定义的7种枚举实例
public static final Day MONDAY;
public static final Day TUESDAY;
public static final Day WEDNESDAY;
public static final Day THURSDAY;
public static final Day FRIDAY;
public static final Day SATURDAY;
public static final Day SUNDAY;
private static final Day $VALUES[];
static
{
//实例化枚举实例
MONDAY = new Day();
TUESDAY = new Day();
WEDNESDAY = new Day();
THURSDAY = new Day();
FRIDAY = new Day();
SATURDAY = new Day();
SUNDAY = new Day();
$VALUES = (new Day[] {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
});
}
}
2、简单枚举类的使用:
新建简单枚举类:People
public enum People {
xiaoming,xiaohei,xiaowang,xiaochen
}
简单枚举类的属性比对使用:
public static void main(String[] args) {
People people=People.xiaoming;
People people1=People.xiaochen;
System.out.println("xiaoming枚举常量名称:"+people.name()+"\t序号:"+people.ordinal()+"\t枚举常量是否唯一:"+people.equals(People.xiaohei));
System.out.println("xiaochen枚举常量名称:"+people1.name()+"\t序号:"+people1.ordinal()+"\t枚举常量是否唯一:"+people.equals(People.xiaochen));
System.out.println("xiaoheiy与xiaochen的比较插值为:"+people.compareTo(people1));
}
简单枚举类使用执行结果:
显示
- 枚举名称与获取的枚举对象相同
- 序号根据常数编写位置由0-N排列
- 枚举常数唯一
- 不同枚举常量的比较结果为序号的差值
3、复杂枚举类的使用:
新建复杂枚举类:Car
public enum Car {
bentian(1,1),baoma(2,2),sanxing(3,3),benci(4,4),xiaopeng(5,5);
int age;
static int si=3;
private Car(int age,int i){
this.age=age;
}
int getAgePlusSi(){
return age+si;
}
static int getSi(){
return si;
}
}
复杂枚举类的属性比对使用:
public static void main(String[] args) {
Car car=Car.baoma;
Car car1=Car.xiaopeng;
System.out.println("baoma枚举常量名称:"+car.name()+"\t序号:"+car.ordinal()+"\t其中age为:"+car.age+"\t类变量si为:"+car.si+"\t调用其中对象方法getAgePlusSi:"+car.getAgePlusSi()+"\t枚举常量可以调用其中类方法getSi:"+car.getSi());
car.si=9;
System.out.println("xiaopeng枚举常量名称:"+car1.name()+"\t序号:"+car1.ordinal()+"\t其中age为:"+car1.age+"\t类变量si为:"+car1.si+"\t调用其中对象方法getAgePlusSi:"+car1.getAgePlusSi()+"\t枚举常量可以调用其中类方法getSi:"+car1.getSi());
System.out.println("baoma与xiaopeng的比较插值为:"+car.compareTo(car1));
}
复杂枚举类使用执行结果:
显示
- 枚举名称与获取的枚举对象相同
- 枚举常量序号根据常数编写位置由0-N排列
- 枚举对象可提前设置对应普通变量枚举类中提前设置类变量(不可在枚举构造器中为类变量赋值,类变量是枚举常量共享的)
- 枚举类中可设置普通方法与类方法
- 不同枚举常量的比较结果为序号的差值
参考博文:以上代码段转载于深入理解Java枚举类型(enum) - 沾青先生 - 博客园,里面有较多关于枚举类的知识。本人转了其中反编译后的枚举类,清晰简要显示了枚举类型的本质。