一、枚举的概念:
枚举是一种引用数据类型,也是一种类,主要用于创建有固定对象,不让用户随意更改其值。
某些类型的对象是有限的几个,如: 星期:Monday(星期一)…Sunday(星期天), 性别:Man(男)、Woman(女), 季节:Spring(春节)…Winter(冬天)…
在JDK1.5之前,需要自己通过特殊的方式来定义枚举类型。
在JDK1.5之后,Java支持enum关键字来快速的定义枚举类型。

二、枚举的声明
(一)JDK1.5之前枚举的声明
JDK1.5之前定义枚举的方法:因为在JDK1.5之前还没有enum关键字,要实现枚举,只能私有化构造器,在本类中创建一组常量对象,并加static修饰(静态修饰的可以由类直接调用),对外暴露这些公开静态的常量,以之被使用。
例如:创建一个季节的枚举类

public class Season{
	//定义一个私有的属性给构造器传参
	private String season;
	//私有化构造器
	private Season(String season){
		this.season = season;
	}
	//创建一组公开静态的季节常量对象
	public static final Season SPRING = new Season("春天");
	public static final Season SUMMER = new Season("夏天");
	public static final Season AUTUMN = new Season("秋天");
	public static final Season WINTER = new Season("冬天");
	@Override
    public String toString() {
        return "季节是:" + season ;
    }
}
//创建一个测试类
public class Test{
	public static void main(String[] args){
		//定义了Season季节的类后,它只有四个公开的对象可以被调用,除此之外不能赋有其他值
		Season spring = Season.SPRING;
		System.out.println(spring);//结果是春天
	}
}

(二)JDK1.5之后枚举的声明
使用关键字enum声明枚举类,枚举类默认继承java.lang.Enum。创建提供当前枚举类的对象,多个对象之间用逗号隔开,末尾元素用分号结束。
enum语法格式:

【修饰符】 enum 枚举类名{
 常量对象列表
 }
 【修饰符】 enum 枚举类名{
 常量对象列表;
 其他成员列表;
 }
public enum Weeks{
	//极简版枚举定义  
	MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY;
}
public enum Weeks{
	//带有属性及描述信息的枚举定义
	MONDAY("星期一","上班摸鱼"),TUESDAY("星期二","灵魂上班"),WEDNESDAY("星期三","愉悦上班"),THURSDAY("星期四","上班吃鸡"),FRIDAY("星期五","疯狂加班"),SATURDAY("星期六","深夜蹦迪"),SUNDAY("周日","睡个好觉");
	private String weekName;
	private String weekDesc;
	private Weeks(String weekName,String weekDesc){
		this.weekName = weekName;
		this.weekDesc = weekDesc;
	}
	@Override
    public String toString() {
        return weekName+":"+weekDesc;
    }
}

(三)注意事项
1.枚举类的常量对象必须放在枚举类的首行,因为是常量,按照命名规范大写,以“;”标识为结束。
2.枚举类默认提供私有无参构造器,如果不需要参数,则私有无参构造器可以不写;根据实际要求,也可以写出私有有参构造器,定义好私有属性。
3.JDK1.5之后,switch支持枚举类型,在case后面可以写枚举常量。
三、枚举中常用的方法
1.name():默认返回 常量对象名;
2.toString():默认返回常量对象名,Enum类已经重写的toString方法。
3.ordinal():返回常量对象的下标,默认从0开始。
4.values():返回当前枚举类的所有对象,返回类型为当前枚举类型,是静态方法,直接由枚举类调用。
5.valueOf():根据输入的参数返回常量对象名,如果参数不匹配,则抛异常。
以上方法使用示例如下:

public class TestWeeks {
    public static void main(String[] args) {
        Weeks friday = Weeks.FRIDAY;
        System.out.println(friday.name());// 默认返回的是常量名(对象名)
        System.out.println(friday.toString());//返回的是常量名(对象名),Enum类重写了toString方法
        System.out.println(friday.ordinal());//返回枚举对象的下标,默认初始下标从0开始
        Weeks[] weeks = Weeks.values();//返回当前枚举类的所有对象,返回类型时枚举的数组类型,是静态方法
        for (Weeks week : weeks) {
            System.out.println(week);
        }     System.out.println(Weeks.valueOf("MONDAY"));//根据输入的参数返回对应的枚举对象常量。
    }
}

四、枚举类型在switch中的使用

public class TestEnum {
	public static void main(String[] args) {
		Season[] values = Season.values();
		for (int i = 0; i < values.length; i++) {
			switch(values[i]){
			case SPRING:
				System.out.println(values[i]+":春暖花开,万物复苏");
				break;
			case SUMMER:
				System.out.println(values[i]+":百花争艳,郁郁葱葱");
				break;
			case AUTUMN:
				System.out.println(values[i]+":菊桂飘香,百树凋零");
				break;
			case WINTER:
				System.out.println(values[i]+":梅花独开,大地一色");
				break;
			}
		}
	}
}
enum Season{
	SPRING,SUMMER,AUTUMN,WINTER
}