java中枚举的使用

ops/2024/12/23 12:30:08/

文章目录

  • 1 枚举
    • 1.1 自定义类实现枚举
    • 1.2 enum 关键字实现枚举
      • 1.2.1 enum 关键字使用注意事项
      • 1.2.2 枚举enum 常用方法说明
        • (1) toString() 方法,返回当前对象名,子类可以重写。
        • (2) name() 方法,返回当前对象名(常量名),子类中不能重写。
        • (3) ordinal() 方法,返回当前对象的位置号,默认从0开始。
        • (4) values() 方法,枚举中的一个特殊方法,在Enum 的 API 文档中也找不到这个方法。
        • (5) valueOf() 方法,将字符串转换成枚举对象,要求字符串必须为已有的常量名,否则报异常!
        • (6) compareTo() 方法,比较2个枚举常量,比较的是它们的编号。
      • 1.2.3 enum 实现接口

1 枚举

枚举对应英文(enumeration, 简写 enum)。 枚举是一组常量的集合。 可以这里理解:枚举属于一种特殊的类,里面只包含一组有限的特定的对象。

枚举的2种实现方式:

  1. 自定义类实现枚举
  2. 使用 enum 关键字实现枚举

1.1 自定义类实现枚举

  自定义类实现枚举按如下步骤进行:

  1. 不需要提供 setXX 方法,因为枚举对象值通常为只读。
  2. 枚举对象/属性使用 final + static 共同修饰,实现底层优化。2者共同修饰,在使用时不会进行类的加载。
  3. 枚举对象名通常使用全部大写,符合常量的命名规范。
  4. 枚举对象根据需要,也可以有多个属性。

案例演示:

java">public class Test {public static void main(String[] args) {}
}class Season {private String name;private String desc;//描述//定义了,四个对象表示4个季节//没有提供 setXX 方法,即不允许修改public static final Season SPRING = new Season("春天", "温暖");public static final Season WINTER = new Season("冬天", "寒冷");public static final Season AUTUMN = new Season("秋天", "凉爽");public static final Season SUMMER = new Season("夏天", "炎热");//1.将构造器私有化,防止 new//2.去掉 setXX 方法,防止属性被修改//3.在 Season 内部,直接创建固定的对象//4.优化,可以加入 final 修饰符private Season(String name, String desc) {this.name = name;this.desc = desc;}//可以提供 getXX 方法public String getName() {return name;}public String getDesc() {return desc;}@Overridepublic String toString() {return "Season{" +"name='" + name + '\' +", desc='" + desc + '\' +'}';}}

总结:进行自定义类实现枚举,有如下的特点:

  1. 构造器私有化
  2. 本类内部创建一组对象[四个季节 春夏秋冬]
  3. 对外暴露对象(通过为对象添加public final static修饰符)
  4. 可以提供get方法,但是不要提供set方法

enum__76">1.2 enum 关键字实现枚举

  由一个使用 enum 关键字的案例来进行体会:

java">public class Test {public static void main(String[] args) {System.out.println(Season2.AUTUMN);System.out.println(Season2.SUMMER);}
}//使用 enum 关键字定义枚举
enum Season2 {//定义了四个对象, 固定.  //public static final Season SPRING = new Season("春天", "温暖");//public static final Season WINTER = new Season("冬天", "寒冷");//public static final Season AUTUMN = new Season("秋天", "凉爽");//public static final Season SUMMER = new Season("夏天", "炎热");//如果使用了enum 来实现枚举//1. 使用关键字 enum 替代 class//2. public static final Season SPRING = new Season("春天", "温暖") 	//直接使用SPRING("春天", "温暖") 解读 常量名(实参列表)//3. 如果有多个常量(对象), 使用 ,号间隔即可//4. 如果使用enum 来实现枚举,要求将定义常量对象,写在最前面//5. 如果我们使用的是无参构造器,创建常量对象,则可以省略 ()SPRING("春天", "温暖"),WINTER("冬天", "寒冷"),AUTUMN("秋天", "凉爽"),SUMMER("夏天", "炎热")/*,What*/;private String name;private String desc;private Season2() {}private Season2(String name, String desc) {this.name = name;this.desc = desc;}public String getName() {return name;}public String getDesc() {return desc;}@OverridepublicStringtoString(){return"Season{"+"name='"+name+'\''+",desc='"+desc+'\''+'}';}
}

enum__133">1.2.1 enum 关键字使用注意事项

  1. 当我们使用 enum 关键字开发一个枚举类时,默认会继承 Enum 类,而且是一个 final 类,使用 javap 反编译指令进行验证。

(1) 进入编译后的类文件所在存储位置,使用 cmd 指令进入命令行窗口。

在这里插入图片描述

(2)使用 javap Season2.class 指令,对类文件进行反编译。
在这里插入图片描述

  可以明显的,看出 enum Season2 定义的枚举类,默认继承了 Enum 类。

  1. 传统的 public static final Season2 SPRING = new Season("春天","温暖"); 简化成了 SPRING("春天","温暖") ,这里需要清楚的是,它调用的构造器是哪一个。
  2. 如果使用了无参构造器,创建枚举对象时,实参列表和小括号都可以省略不写。
  3. 当有多个枚举对象时,使用 逗号( , ) 间隔,最后有一个分号( ; )结尾。
  4. 枚举对象必须放在枚举类的行首。

enum__155">1.2.2 枚举enum 常用方法说明

  使用关键字 enum 时,会隐式的继承 Enum 类,这样我们就可以使用 Enum 类相关的方法。

Enum类的方法如下:

在这里插入图片描述

(1) toString() 方法,返回当前对象名,子类可以重写。

在这里插入图片描述

例如:

java">public class Test {public static void main(String[] args) {Week monday = Week.MONDAY;System.out.println(monday.toString());//输出 MONDAY}
}
enum Week {MONDAY;
}
(2) name() 方法,返回当前对象名(常量名),子类中不能重写。

在这里插入图片描述

例如:

java">public class Test {public static void main(String[] args) {Week monday = Week.MONDAY;System.out.println(monday.name());//输出 MONDAY}
}
enum Week {MONDAY;
}
(3) ordinal() 方法,返回当前对象的位置号,默认从0开始。

在这里插入图片描述

例如:

java">public class Test {public static void main(String[] args) {Week week = Week.TUESDAY;System.out.println(week.ordinal());//TUESDAY 在定义时在第二个位置,从0开始,所以为1//输出 1}
}
enum Week {MONDAY,TUESDAY,WEDNESDAY;
}
(4) values() 方法,枚举中的一个特殊方法,在Enum 的 API 文档中也找不到这个方法。

  通过上面的反编译后的信息可以看到有这个方法:

在这里插入图片描述

  它的作用是:将枚举类中的所有枚举对象常量,转变为一个枚举类型的数组,元素下标即为枚举常量的声明位置,从0开始。

例如:

java">public class Test {public static void main(String[] args) {Week[] week = Week.values();//此时,week 数组有3个元素// week[0] = MONDAY// week[1] = TUESDAY// week[2] = WEDNESDAY}
}
enum Week {MONDAY,TUESDAY,WEDNESDAY;
}

(5) valueOf() 方法,将字符串转换成枚举对象,要求字符串必须为已有的常量名,否则报异常!

在这里插入图片描述

例如:

java">public class Test {public static void main(String[] args) {//执行流程//1. 根据你输入的 "MONDAY" 到 Week 的枚举对象去查找//2. 如果找到了,就返回,如果没有找到,就报错Week week = Week.valueOf("MONDAY");//易知,MONDAY 在Week中存在,且能找到//即,week = Week.MONDAY;}
}
enum Week {MONDAY,TUESDAY,WEDNESDAY;
}

(6) compareTo() 方法,比较2个枚举常量,比较的是它们的编号。

在这里插入图片描述

java">public class Test {public static void main(String[] args) {int result;result = Week.MONDAY.compareTo(Week.WEDNESDAY);//即,MONDAY 在第一个,为0// WEDNESDAY 在第三个,为2//所以  Week.MONDAY.compareTo(Week.WEDNESDAY)// 为,0 - 2 = -2System.out.println(result);//输出 -2}
}
enum Week {MONDAY,TUESDAY,WEDNESDAY;
}

enum__303">1.2.3 enum 实现接口

  1. 使用 enum 关键字后,就不能再继承其它类了,因为 enum 会隐式继承 Enum 类,而 java 是单继承机制。

  2. 枚举类和普通类一样,可以实现接口,语法如下:

    java">enum 类名 implements 接口1, 接口2 {}
    

案例演示:

java">public class Test {public static void main(String[] args) {Week.MONDAY.say();}
}
interface A {void say();
}
enum Week implements A{MONDAY,TUESDAY,WEDNESDAY;@Overridepublic void say() {System.out.println("枚举类实现了接口A的say()方法");}
}
文章来源:https://blog.csdn.net/weixin_74200123/article/details/144567358
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/ops/143143.html

相关文章

Qt C++ OpenCV实现人脸跟踪

一、概述 通过 Qt 和 OpenCV 组合实现人脸跟踪系统,可以将实时视频中的人脸检测和跟踪功能应用于监控、功能识别等场景。OpenCV 提供的前处理和模型装载功能,进一步与 Qt 的繁荣应用程序展示功能相结合,可以极大地提升实时处理效果。 二、环境汇总 安装必要软件Qt Framewo…

使用 NVIDIA DALI 计算视频的光流

引言 光流(Optical Flow)是计算机视觉中的一种技术,主要用于估计视频中连续帧之间的运动信息。它通过分析像素在时间维度上的移动来预测运动场,广泛应用于目标跟踪、动作识别、视频稳定等领域。 光流的计算传统上依赖 CPU 或 GP…

学习记录(13):VR晕动症-VR Motion Sickness

文章目录 前言一、感官运动冲突二、视觉辐辏调节冲突三、模糊 前言 学习参考链接:https://zhuanlan.zhihu.com/p/629833652 常见的引发VR晕动症的原因有三种,分别是感官运动冲突、视觉辐辏调节冲突、视觉模糊。 一、感官运动冲突 感官运动冲突主要指的…

单片机:实现蜂鸣器数码管的显示(附带源码)

单片机实现蜂鸣器数码管显示 蜂鸣器和数码管在嵌入式系统中广泛应用。蜂鸣器可以发出声音警告或提示,而数码管则用于显示数字或字母。在本项目中,我们将通过8051单片机实现一个控制蜂鸣器和数码管显示的系统,结合使用蜂鸣器和数码管&#xf…

网络安全创新实验

一、网络拓扑设计 二、网络主机概况 本实验一共包含4台虚拟机,分别为攻击机attacker,网关gateway,内网普通用户主机pc,内网服务器server,四台主机的详细信息如下表所示: 名称操作系统IP地址网络模式作用攻…

Unity UI Button 事件优先级调整技术方案

Unity UI Button 事件优先级调整技术方案 在 Unity 项目开发过程中,针对 UI Button 的事件执行顺序控制是一个常见需求。本文详细阐述两种将新添加事件置于第一个执行位置的方法,旨在为开发者提供全面且专业的技术参考。 一、基于反射机制的事件插入方…

游戏引擎学习第49天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾 我们当时在讨论我们必须要进行一些改进,以便在游戏中实现更好的碰撞检测。当时展示了一种非常基本的形式,以十字路口为例来实现碰撞交叉工作。然后我们意识到需要升级到更复杂的水平,以便…

shell编程——AWK 从入门到精通

1. 前言 在日常运维、数据分析和开发工作中,处理文本数据是不可避免的任务。无论是从日志中提取关键信息,还是批量处理数据表,效率和灵活性都至关重要。AWK 是 UNIX/Linux 环境中一款轻量级却功能强大的文本处理工具,它以简洁的语…