前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >枚举类型

枚举类型

作者头像
星哥玩云
发布2022-09-14 20:35:02
7760
发布2022-09-14 20:35:02
举报
文章被收录于专栏:开源部署开源部署

1、枚举概述

1.1、什么是枚举

枚举,英文:Enumeration

“枚举”的字面意思:枚,是个量词,可以理解成是个。比如:一枚金牌、一枚银牌。举:就是例举的意思。枚举合起来的意思就是例举出有限的事物的集合!例如:例举一周有几天、一年有多少个月份。

枚举的正式解释:枚举类型是jdk5中新增的特性,它是一种加了限制的特殊的class类型。这里的限制指的是对枚举类型所能创建的对象的个数进行了限制!他不像普通的class类那样可以创建无数的对象,他只能创建固定数目的对象,而且这些对象是在定义枚举类型的时候就已经在枚举类内部创建好了的!

1.2、为什么要用枚举?

因为在有的时候一个类的对象是有限且固定的,所以这个时候用枚举就很方便!

例如:一周有七天、一年有四季

不用枚举(JDK1.5之前)

代码语言:javascript
复制
public class Week{
	private Week(){}//私有构造器
	public static final Week SUN = new Week();
	public static final Week MON = new Week();
	public static final Week TUE = new Week();
	public static final Week WED = new Week();
	public static final Week THU = new Week();
	public static final Week FRI = new Week();
	public static final Week SAT = new Week();
}

使用枚举(JDK1.5之后)

代码语言:javascript
复制
public enum WeekEnum {
    SUN,MON,TUE,WED,THU,FRI,SAT;
}

2、枚举的使用

2.1、枚举的定义

枚举的定义其实和类的定义是一样的,只是关键字不一样,定义枚举的关键字是enum

代码语言:javascript
复制
//定义一个类
public class 类名称{
	//类成员
}
//定义了一个星期的枚举类
public enum WeekEnum {//class
    //枚举对象
    SUN,MON,TUE,WED,THU,FRI,SAT;//object  -->枚举常量
}
代码语言:javascript
复制
public class Week{
	private Week(){}//私有构造器
	public static final Week SUN = new Week();
	public static final Week MON = new Week();
	public static final Week TUE = new Week();
	public static final Week WED = new Week();
	public static final Week THU = new Week();
	public static final Week FRI = new Week();
	public static final Week SAT = new Week();
}

注意事项:

​ (1)、枚举值都定义在枚举类中。

​ (2)、枚举常量值的书写要遵循Java标识符的规范,一般都是全部大写。

​ (3)、定义的枚举值和枚举值之间用“,”隔开,定义完所有的枚举值之后要加";"。

​ (4)、每一个枚举值都是一个常量,定义之后都不能更改!

(完结)

2.2、枚举对象的使用

代码语言:javascript
复制
public enum WeekEnum {
    SUN,MON,TUE,WED,THU,FRI,SAT;
}
代码语言:javascript
复制
public static void main(String[] args){
    WeekEnum day =WeekEnum.MON;//枚举类名 枚举对象名 = 枚举类名.枚举常量名
    System.out.println(day);//枚举常量的表现形式
}

2.3、枚举类的简单练习

定义一个季节的枚举类,并使用该枚举类

代码语言:javascript
复制
public enum Season{
	SPRING,SUMMER,AUTUMN,WINTER;
}
public static void main(String[] args){
    //直接引用
    Season s =Season.SPRING;
    System.out.println(s);//Spring
}

定义一个月份的枚举类,并使用该枚举类

代码语言:javascript
复制
public enum Month{		January,February,March,April,May,June,July,August,September,October,November,December;
}

public static void main(String[] args){
    //直接引用
    Month m =Month.December;
    System.out.println(m);//Spring
}

3、枚举原理

所有的枚举类其实默认是继承Enum类,也就是我们声明一个枚举类,他默认就继承Enum类。我们不能再用枚举类继承其他的类,但可以用枚举类实现接口。如下图所示:

​ 枚举类不能继承,因为枚举默认继承Enum类

image20191216180041514.png
image20191216180041514.png

​ 枚举可以实现接口

image20191216180257140.png
image20191216180257140.png

3.1、Enum抽象类常见方法

方法

方法说明

String name()

返回此枚举常量的名称,在其枚举声明中对其进行声明

static Enum valueOf(String name)

返回带指定名称的指定枚举类型的枚举常量

int ordinal()

返回枚举常量的序数(初始常量序数为零)

String toString()

返回枚举常量的名称,它包含在声明中

static Enum[] values()

返回该枚举中所有枚举常量的数组

代码演示

代码语言:javascript
复制
 		Week mon = Week.MON;
        System.out.println(mon.name());//返回枚举常量的字符串名称

        Week tue = Week.valueOf("TUE");//返回枚举常量
        System.out.println(tue); //相当于调用tue.toString()方法

        Week[] values = Week.values();//返回Week中的所有的枚举常量
        System.out.println(Arrays.toString(values));

        int index = tue.ordinal();//返回该枚举常量在枚举类中的索引
        System.out.println(index);

运行结果:

image20191216184921866.png
image20191216184921866.png

3.2、枚举类的成员

前面我们说了,枚举类就是一个特殊的类,特殊的地方在于枚举类的对象是有限的?那么枚举类能不能像普通的类一样,可以有构造器、成员变量、成员方法呢?

答案是肯定的!

3.2.1、无参构造

枚举类和普通的类一样,如果没有为其添加构造方法的话,他默认是有一个无参构造方法。和普通类不同的是,枚举类的构造方法的访问权限修饰符必须是private!

image20191216190213925.png
image20191216190213925.png
image20191216190312371.png
image20191216190312371.png
3.2.2、带参构造
代码语言:javascript
复制
public enum Week{
    SUN("周日"),
    MON("周一"),
    TUE("周二"),
    WED("周三"),
    THU("周四"),
    FRI("周五"),
    SAT("周六");
    //定义成员变量
    private String chineseName;
    //带参的构造函数
    private Week(String chineseName){
        this.chineseName=chineseName;
    };
    //定义成员方法
    //获取枚举值对应的中文名称
    public String getChineseName(){
        return chineseName;
    }
}
代码语言:javascript
复制
public class TestWeek {
    public static void main(String[] args) {
        Week mon = Week.MON;
        System.out.println(mon);
        System.out.println(mon.getChineseName());
    }
}

运行结果

image20191217102516422.png
image20191217102516422.png

3.3、为枚举类添加接口

代码语言:javascript
复制
//方式一:
//枚举实现接口,并实现接口方法
public enum Week implements enumInter {

    SUN,MON,TUE,WED,THU,FRI,SAT;

    @Override
    public void method() {
        System.out.println("我是枚举中的接口");
    }
}

interface enumInter{
    public abstract  void method();
}
代码语言:javascript
复制
//方式二
//枚举类不实现抽象类中的方法,而让每个枚举常量以==匿名内部类==的方式实现
public enum Week implements enumInter {
    
    SUN{
        @Override
        public void method() {
            System.out.println("我是周日");
        }
    },
    MON{
        @Override
        public void method() {
            System.out.println("我是周一");
        }
    };
}

interface enumInter{
    public abstract  void method();
}

4、枚举集合类EnumSet和EnumMap

4.1、EnumSet

此枚举集合类EnumSet实现了Set集合接口,是一个抽象类,他可以将一个枚举类转换成一个Set集合!

具体转换操作如下所示!

代码语言:javascript
复制
public enum Week {
    SUN,MON,TUE,WED,THU,FRI,SAT;
}

public class TestWeek {
    public static void main(String[] args) {
        EnumSet<Week> set = EnumSet.allOf(Week.class);
        for (Week w:set) {
            System.out.println(w);
        }
    }
}

运行结果如下

image20191217110900980.png
image20191217110900980.png

4.2、EnumMap

此枚举集合类EnumMap实现了Map集合接口,他可以将一个枚举类转换成一个Map集合!

其中键是枚举常量,值是字符串类型

具体转换操作如下所示!

代码语言:javascript
复制
//创建枚举类Week
public enum Week {
    SUN,MON,TUE,WED,THU,FRI,SAT;
}

public class TestWeek {
    public static void main(String[] args) {
		//创建EnumMap集合
        //键:Week枚举常量
        //值:对该常量的字符串描述
        EnumMap<Week,String> map = new EnumMap<Week, String>(Week.class);
        //添加集合元素
        map.put(Week.MON,"周一");
        map.put(Week.TUE,"周二");
		//遍历集合
        Set<Map.Entry<Week, String>> entries = map.entrySet();
        for (Map.Entry<Week, String> entry:entries) {
            System.out.println("key:"+entry.getKey()+"   value:"+entry.getValue());
        }
    }
}

运行结果如下:

image20191217111809479.png
image20191217111809479.png
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、枚举概述
    • 1.1、什么是枚举
      • 1.2、为什么要用枚举?
      • 2、枚举的使用
        • 2.1、枚举的定义
          • 2.2、枚举对象的使用
            • 2.3、枚举类的简单练习
            • 3、枚举原理
              • 3.1、Enum抽象类常见方法
                • 3.2、枚举类的成员
                  • 3.2.1、无参构造
                  • 3.2.2、带参构造
                • 3.3、为枚举类添加接口
                • 4、枚举集合类EnumSet和EnumMap
                  • 4.1、EnumSet
                    • 4.2、EnumMap
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档