阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

枚举类型

109次阅读
没有评论

共计 4305 个字符,预计需要花费 11 分钟才能阅读完成。

1、枚举概述

1.1、什么是枚举

枚举, 英文:Enumeration

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

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

1.2、为什么要用枚举?

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

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

不用枚举(JDK1.5 之前)

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 之后)

public enum WeekEnum {SUN,MON,TUE,WED,THU,FRI,SAT;}

2、枚举的使用

2.1、枚举的定义

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

// 定义一个类 public class 类名称{// 类成员 } // 定义了一个星期的枚举类 public enum WeekEnum {//class // 枚举对象 SUN,MON,TUE,WED,THU,FRI,SAT;//object --> 枚举常量 }
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、枚举对象的使用

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

2.3、枚举类的简单练习

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

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

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

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 类

枚举类型

枚举可以实现接口

枚举类型

3.1、Enum 抽象类常见方法

方法 方法说明
String name() 返回此枚举常量的名称,在其枚举声明中对其进行声明
static Enum valueOf(String name) 返回带指定名称的指定枚举类型的枚举常量
int ordinal() 返回枚举常量的序数(初始常量序数为零)
String toString() 返回枚举常量的名称,它包含在声明中
static Enum[] values() 返回该枚举中所有枚举常量的数组

代码演示

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);

运行结果:

枚举类型

3.2、枚举类的成员

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

答案是肯定的!

3.2.1、无参构造

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

枚举类型

枚举类型

3.2.2、带参构造

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; } }
public class TestWeek {public static void main(String[] args) {
        Week mon = Week.MON;
        System.out.println(mon);
        System.out.println(mon.getChineseName());
    }
}

运行结果

枚举类型

3.3、为枚举类添加接口

// 方式一: // 枚举实现接口,并实现接口方法 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(); }
// 方式二 // 枚举类不实现抽象类中的方法,而让每个枚举常量以 == 匿名内部类 == 的方式实现 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 集合!

具体转换操作如下所示!

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); } } }

运行结果如下

枚举类型

4.2、EnumMap

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

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

具体转换操作如下所示!

// 创建枚举类 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()); } } }

运行结果如下:

枚举类型

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-06-06发表,共计4305字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中