Java 枚举类 详解
1、枚举是什么?
Java中的枚举其实是一种语法糖,在 JDK 1.5之后出现,用来表示固定且有限个的对象。比如一个季节类有春、夏、秋、冬四个对象;一个星期有星期一到星期日七个对象。这些明显都是固定的,且有限个。
2、枚举类和普通类的区别
①、使用 enum 定义的枚举类默认继承 java.lang.Enum 类,即枚举类是不能再继承别的类了。而普通类的一般父类默认是 Object
②、枚举类的构造器只能使用 private 定义,而普通类的还可以用 public 修饰
③、枚举类的所有实例必须在枚举类中显示列出(,分隔 ;结尾),列出的实例系统会默认自动添加 public static final 修饰
④、所有的枚举类都提供了一个 values() 方法,可以用来遍历枚举值
3、怎么用枚举?
首先我们看,以一个季节类有春、夏、秋、冬四个对象为例:在 JDK 1.5以前是怎么表示的呢?
创建一个 季节类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public class Season { //属性不能修改,用 final 修饰 private final String name; private final String desc; //因为枚举类的对象是有限的,即我们不能再外面 new Season(),所以构造器私有化 private Season(String name,String desc) { this .name = name; this .desc = desc; } //不能再外面new Season(),那么内部必须创建出对象 //外界直接通过类名来访问,用 static 修饰 //外界不能修改,用 final 修饰 public static final Season SPRING = new Season( "春天" , "春暖花开" ); public static final Season SUMMER = new Season( "夏天" , "炎炎盛夏" ); public static final Season FALL = new Season( "秋天" , "秋高气爽" ); public static final Season WINTER = new Season( "冬天" , "大雪纷飞" ); @Override public String toString() { return "Season [name=" + name + ", desc=" + desc + "]" ; } } |
测试:
1 2 3 4 5 6 7 8 9 | public class SeasonTest { public static void main(String[] args) { System.out.println(Season.SPRING); System.out.println(Season.SUMMER); System.out.println(Season.FALL); System.out.println(Season.WINTER); } } |
结果为:
1 2 3 4 | Season [name=春天, desc=春暖花开] Season [name=夏天, desc=炎炎盛夏] Season [name=秋天, desc=秋高气爽] Season [name=冬天, desc=大雪纷飞] |
使用 Enum 来表示季节类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public enum SeasonEnum { //必须在第一行写出有哪些枚举值 SPRING( "春天" , "春暖花开" ), SUMMER( "夏天" , "炎炎盛夏" ), FALL( "秋天" , "秋高气爽" ), WINTER( "冬天" , "大雪纷飞" ); private final String name; private final String desc; private SeasonEnum(String name, String desc) { this .name = name; this .desc = desc; } } |
测试:
1 2 3 4 5 6 7 8 | public static void main(String[] args) { System.out.println(SeasonEnum.SPRING); //SPRING //用 values() 来获取所有的枚举值 for (SeasonEnum s : SeasonEnum.values()){ System.out.println(s); } } |
枚举类还能实现接口:
第一步:定义一个接口,方法是返回季节的月份
1 2 3 4 5 | public interface SeasonEnumImpl { //用来返回季节的月份 String getMonth(); } |
第二步:季节类实现接口,并实现接口中的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | public enum SeasonEnum implements SeasonEnumImpl{ //必须在第一行写出有哪些枚举值 SPRING( "春天" , "春暖花开" ){ @Override public String getMonth() { return "12-2" ; } }, SUMMER( "夏天" , "炎炎盛夏" ){ @Override public String getMonth() { return "3-5" ; } }, FALL( "秋天" , "秋高气爽" ){ @Override public String getMonth() { return "6-8" ; } }, WINTER( "冬天" , "大雪纷飞" ){ @Override public String getMonth() { return "9-11" ; } }; private final String name; private final String desc; private SeasonEnum(String name, String desc) { this .name = name; this .desc = desc; } } |
测试:
1 2 3 4 5 6 7 8 9 | public static void main(String[] args) { System.out.println(SeasonEnum.SPRING); //SPRING //用 values() 来获取所有的枚举值 for (SeasonEnum s : SeasonEnum.values()){ System.out.println(s.getMonth()); } } |
结果为:
1 2 3 4 5 | SPRING 12 - 2 3 - 5 6 - 8 9 - 11 |
注意:
①、枚举类可以作为 switch--case 的表达式(JDK 1.5以后)
②、如果枚举类的对象只有一个,那么可以作为单例模式的实现
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?