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);
}
}
当我们将鼠标移动到定义的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类中,我们对其构造方法进行重写,显式地输出"实例化"三个字,我们就会得到这样的结果
结合上面一段代码里面的注释,看到定义一个枚举类实际进行的操作,不难理解这里为什么是输出了四个实例化(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;
}
目前关于枚举的就先到这里了~~