1.枚举概述

与其他Java类一样,枚举也是一种引用数据类型,一般应用于一些取值范围比较固定的场景

  •  星期:周一到周天
  • 月份:1-12
  • 季节:春夏秋冬 

在这里为什么要使用枚举呢?我们主要还是为了提高输入数据的安全性,以及程序的可读性

(比如说当输入的时候,输入13月,这明显是错误的输入)

2.枚举的定义

package Enum;

/**
 * 	枚举定义测试类
 * @author glowing star
 *
 */
enum Season {
	SPRING,SUMMER,AUTUMN,WINTER;
}

public class EnumTest{
	public static void main(String[] args) {
		Season s=Season.AUTUMN;
		System.out.println(s);
	}
	
}

Java自动生成并加载枚举_Java自动生成并加载枚举

    当我们将鼠标移动到定义的Season类旁边时,就可以看见定义的值

上述简单的代码输出的就是SPRING,我们定义枚举的时候所列的枚举值就是常量(前面加了关键字public static final ,因为是static,所以才可以直接 . 名称,下段代码有详细描述定义枚举值时实际进行的操作)

下面还有一个点,刚才我们说枚举的时候,相当于给枚举值前面加了static,那么我们使用Season类的时候,每一个都会被实例化,下面来浅浅证明一下:

enum Season {
	//这里定义SPRING的时候,实际上是进行了这样的操作:
	//public static final Season SRING=new Season();
	SPRING,SUMMER,AUTUMN,WINTER;
    //构造方法是私有的
	private Season() {
		System.out.println("实例化");
	}
}

public class EnumTest{
	public static void main(String[] args) {
		Season s=Season.AUTUMN;
		System.out.println(s);
	}

 在Season类中,我们对其构造方法进行重写,显式地输出"实例化"三个字,我们就会得到这样的结果

Java自动生成并加载枚举_Java自动生成并加载枚举_02

结合上面一段代码里面的注释,看到定义一个枚举类实际进行的操作,不难理解这里为什么是输出了四个实例化(SPRING,SUMMER,AUTUMN,WINTER各一次咯)

3.枚举的使用

        3.1 枚举使用过程中可以正常定义成员变量,成员方法(包括static方法),下面还是用一个简单的例子来展示

//在枚举类中可以正常定义成员变量和成员方法
	private String des;
	public String getDes() {
		return des;
	}
	public void setDes(String des) {
		this.des = des;
	}
	
	//在枚举类中可以正常定义static方法,这里使用for循环遍历
	public static Season getSeasonByDes(String des) {
		//遍历Season
		for(Season val:Season.values()) {
			if(val.des.equals(des)) {
				return val;
			}
		}
		return null;
	}

        3.2当我们重新建议一个构造器的时候,那么定义枚举值的时候也应该做相应的改变,原因在上面(定义一个枚举值的时候实际进行了什么样的操作)

enum Season {
	//这里定义SPRING的时候,实际上是进行了这样的操作:
	//public static final Season SRING=new Season();
	SPRING("warm"),SUMMER("hot"),AUTUMN("cool"),WINTER("cold");
	
	private Season() {
		System.out.println("实例化");
	}
	//通过传入参数对定义的枚举值进行初始化
	private Season(String des) {
		this.des=des;
	}
	//在枚举类中可以正常定义成员变量和成员方法
	private String des;
	public String getDes() {
		return des;
	}
	public void setDes(String des) {
		this.des = des;
	}
	
	//在枚举类中可以正常定义static方法,这里使用for循环遍历
	public static Season getSeasonByDes(String des) {
		//遍历Season
		for(Season val:Season.values()) {
			if(val.des.equals(des)) {
				return val;
			}
		}
		return null;
	}
	
}

public class EnumTest{
	public static void main(String[] args) {
		Season s=Season.AUTUMN;
		s=Season.getSeasonByDes("hot");
		System.out.println(s);
	}
	
}

此时,输出结果是与hot相对应的SUMMER,所以说枚举值的定义就这样可以被扩展使用

        3.3接下来我们尝试着重写枚举类里面的函数,用一个最简单的例子,我们来重写toString方法:

public String toString() {
		return "The feature of the season is "+des;
	}


public static void main(String[] args) {
		Season s=Season.AUTUMN;
		s=Season.getSeasonByDes("hot");
		System.out.println(s);
	}

就列出了两个方法,结果就是The feature of this season is hot 简简单单不再赘述重写

        3.4除了以上所说的,枚举类还可以实现接口,但是由于并不常使用,就不再多说了,只是简单一点,和其他类一样,实现接口需要实现接口里面的所有方法(所有!!!,虽然是接口里面的知识了)

        3.5switch/case中的枚举,这是我们很常用的枚举,就是说,我们可以用枚举来实现switch/case,这里还是举了一个简单的例子,便于大家理解

Season s=Season.AUTUMN;
		switch(s) {
		case SPRING:
			System.out.println("It's Spring now.");
			break;
		case SUMMER:
			System.out.println("It's Summer now.");
			break;
		case AUTUMN:
			System.out.println("It's Autumn now.");
			break;
		case WINTER:
			System.out.println("It's Winter now.");
			break;
		}

目前关于枚举的就先到这里了~~