Java基础知识07--枚举类型Enum的使用
1.枚举的概述
JDK1.5引入了新的类型——枚举。
Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。
Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。
创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式 Class Enum<E extends Enum>,而 E 表示枚举类型的名称。
所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。
values(), ordinal() 和 valueOf() 方法位于 java.lang.Enum 类中:
- values() 返回枚举类中所有的值。
- ordinal()方法可以找到每个枚举常量的索引,就像数组索引一样。
- valueOf()方法返回指定字符串值的枚举常量。
2.枚举型常量
枚举类:
public enum SeasonEnum { //每个成员变量都是final static修饰 SPRING,SUMMER,AUTUMN,WINTER }
测试类:
public class SeasonTest { public static void main(String[] args) { for (SeasonEnum seasonEnum : SeasonEnum.values()) { System.out.println(seasonEnum+",ordinal:"+seasonEnum.ordinal()+",name:"+seasonEnum.name()); } } }
控制台输出:
SPRING,ordinal:0,name:SPRING SUMMER,ordinal:1,name:SUMMER AUTUMN,ordinal:2,name:AUTUMN WINTER,ordinal:3,name:WINTER
3.带一个参数的枚举
SeasonEnum 枚举类有了chinese这个成员变量,所以我们在定义实例对象时就要维护这个chinese成员变量。
枚举类:
public enum SeasonEnum { //枚举类的实例对象必须在最前面先定义,而且必须每个实例对象都必须维护上chinese成员变量 SPRING("春天"),SUMMER("夏天"),AUMUTN("秋天"),WINTER("冬天"); private String chinese; //枚举类型的构造函数默认为private,因为枚举类型的初始化要在当前枚举类中完成。 SeasonEnum (String chinese){ this.chinese= chinese; } public String getChinese(){ return chinese; } }
测试类:
public class SeasonTest { public static void main(String[] args) { //直接初始化 SeasonEnum season1 = SeasonEnum.SPRING; //调用SeasonEnum枚举类的getChinese()方法获取SPRING的中文值 System.out.println(season1.getChinese()); } }
控制台输出:
春天
4.带两个参数的枚举
在枚举类中增加了name/code两个属性,并重新编写了构造方法。
枚举类:
public enum SeasonEnum { //枚举类的实例对象必须在最前面先定义 SPRING("春天",1201), SUMMER("夏天",1202), AUMUTN("秋天",1203), WINTER("冬天",1204); private String name; private Integer code; //枚举类型的构造函数默认为private,因为枚举类型的初始化要在当前枚举类中完成。 SeasonEnum (String name,Integer code){ this.name=name; this.code=code; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } @Override public String toString() { return this.name()+"("+this.code+")"; } }
测试类:
public class SeasonTest { public static void main(String[] args) { //直接初始化 SeasonEnum season1 = SeasonEnum.SPRING; System.out.println(season1.getName()); System.out.println(season1.toString()); } }
控制台输出:
春天
SPRING(1201)
5.枚举类中定义抽象方法
既然编译器最终将每个枚举值声明为枚举类的实例,那我们能在枚举类中声明抽象方法让枚举值去实现么?
在枚举类Season中声明了一个抽象方法sayHello()。然后在创建枚举值时,就必须实现该抽象方法。
枚举类:
public enum SeasonEnum { //枚举类的实例对象必须在最前面先定义,而且必须每个实例对象都必须维护上chinese成员变量 SPRING("春天",1201){ @Override void sayHello() { System.out.println("hello spring"); } }, SUMMER("夏天",1202){ @Override void sayHello() { System.out.println("hello summer"); } }, AUTUMN("秋天",1203){ @Override void sayHello() { System.out.println("hello autumn"); } }, WINTER("冬天",1204){ @Override void sayHello() { System.out.println("hello winter"); } }; private String name; private Integer code; //枚举类型的构造函数默认为private,因为枚举类型的初始化要在当前枚举类中完成。 SeasonEnum (String name,Integer code){ this.name=name; this.code=code; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } abstract void sayHello(); }
测试类:
public class SeasonTest { public static void main(String[] args) { //直接初始化 SeasonEnum season1 = SeasonEnum.SPRING; //调用SeasonEnum枚举类的sayHello方法 season1.sayHello(); } }
控制台输出:
hello spring
参考文献:https://blog.csdn.net/qq_27093465/article/details/52180865
https://blog.csdn.net/sihai12345/article/details/81070174(重点参考)
https://zhuanlan.zhihu.com/p/64605561
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)