Java 枚举(Enum)简介

         Java 枚举(Enum)是一种特殊的类,它用于定义一组固定的常量值。枚举提供了一种类型安全的方式来表示一组固定的值。在 Java 中,枚举是实现单例模式的一种方式,并且它们是 Java 语言的一部分,而不是类库的一部分。

        枚举的基本特性

1. **类型安全**:枚举类型提供了一种编译时类型检查,确保变量只能被赋予枚举中定义的值。
2. **常量集合**:枚举定义了一组命名的常量,这些常量是该枚举类型的实例。
3. **单例**:每个枚举常量都是唯一的,不能创建额外的实例。
4. **命名空间**:枚举提供了一个命名空间,可以避免常量名冲突。
5. **实现接口**:枚举可以实现接口,这使得它们可以作为接口类型的对象。
6. **继承**:枚举继承自 `java.lang.Enum` 类,但它们不能继承其他类。
7. **方法和字段**:枚举可以包含字段和方法,这些可以是静态的也可以是非静态的。

        创建枚举

在 Java 中,创建枚举非常简单。以下是一个简单的枚举示例:


public enum Color {RED, GREEN, BLUE;
}

在这个例子中,我们定义了一个名为 `Color` 的枚举,它有三个枚举常量:`RED`、`GREEN` 和 `BLUE`。

        使用枚举

使用枚举非常简单,你可以直接使用枚举常量,而不需要创建枚举的实例。


public class Test {public static void main(String[] args) {Color color = Color.RED;System.out.println(color); // 输出:RED}
}

        枚举方法

枚举可以包含方法,这些方法可以是实例方法也可以是静态方法。实例方法可以操作枚举常量,而静态方法可以操作枚举本身。

```java
public enum Operation {ADD {public int apply(int x, int y) { return x + y; }},SUBTRACT {public int apply(int x, int y) { return x - y; }};public abstract int apply(int x, int y);
}public class Test {public static void main(String[] args) {int result = Operation.ADD.apply(5, 3);System.out.println(result); // 输出:8}
}

在这个例子中,我们定义了一个名为 `Operation` 的枚举,它有两个枚举常量:`ADD` 和 `SUBTRACT`。每个枚举常量都实现了 `apply` 方法,该方法接受两个整数参数并返回它们的运算结果。

        枚举字段

枚举可以包含字段,这些字段可以是公共的、私有的、静态的或非静态的。


public enum Direction {NORTH("北"),SOUTH("南"),EAST("东"),WEST("西");private final String description;Direction(String description) {this.description = description;}public String getDescription() {return description;}
}public class Test {public static void main(String[] args) {System.out.println(Direction.NORTH.getDescription()); // 输出:北}
}

在这个例子中,我们定义了一个名为 `Direction` 的枚举,它包含了一个名为 `description` 的私有字段。每个枚举常量在创建时都会接收一个描述字符串。我们还提供了一个公共的 `getDescription` 方法来获取描述。

        枚举的 switch 语句

在 Java 中,你可以使用 switch 语句来处理枚举类型。


public class Test {public static void main(String[] args) {Color color = Color.RED;switch (color) {case RED:System.out.println("红色");break;case GREEN:System.out.println("绿色");break;case BLUE:System.out.println("蓝色");break;default:System.out.println("未知颜色");}}
}

         枚举的实例方法

枚举的实例方法可以操作枚举常量。以下是一个使用实例方法的例子:


public enum TrafficLight {RED {public String getColor() {return "停车";}},YELLOW {public String getColor() {return "准备";}},GREEN {public String getColor() {return "行驶";}};public abstract String getColor();public static void main(String[] args) {for (TrafficLight light : TrafficLight.values()) {System.out.println(light.getColor());}}
}

在这个例子中,我们定义了一个名为 `TrafficLight` 的枚举,它有三个枚举常量,每个常量都重写了 `getColor` 方法来返回对应的信号灯描述。

        枚举的比较

枚举常量之间的比较是基于它们在枚举中声明的顺序。第一个声明的常量被认为是最小的,最后一个声明的常量被认为是最大的。


public class Test {public static void main(String[] args) {Color color1 = Color.RED;Color color2 = Color.GREEN;if (color1.compareTo(color2) < 0) {System.out.println("RED is before GREEN");} else {System.out.println("GREEN is before RED");}}
}

在这个例子中,我们比较了两个枚举常量 `color1` 和 `color2`。由于 `RED` 在枚举中声明的顺序在 `GREEN` 之前,所以 `color1.compareTo(color2)` 的结果是负数。

        枚举的序列化和反序列化

枚举类型是可序列化的,这意味着它们可以被写入流中,并在以后的时间点被读取回来。


public class Test {public static void main(String[] args) {try {FileOutputStream fileOut = new FileOutputStream("enum.txt");ObjectOutputStream out = new ObjectOutputStream(fileOut);out.writeObject(Color.RED);out.close();fileOut.close();FileInputStream fileIn = new FileInputStream("enum.txt");ObjectInputStream in = new ObjectInputStream(fileIn);Color color = (Color) in.readObject();in.close();fileIn.close();System.out.println(color); // 输出:RED} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}

在这个例子中,我们将 `Color.RED` 写入到一个文件中,然后从文件中读取回来。

         结论

        枚举是 Java 中一种非常有用的类型,它提供了一种类型安全的方式来表示一组固定的值。通过使用枚举,你可以避免使用散列的常量名,并且可以利用它们提供的一系列特性,如实例方法、字段、switch 语句处理等。枚举使得代码更加清晰、易于维护,并且减少了出错的可能性。在设计应用程序时,如果遇到一组固定的值,考虑使用枚举是一个非常好的选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/706979.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

30天自制操作系统(第21天)

21.1 攻克难题——字符串显示API 显示单个字符时&#xff0c;用 [CS:ECX] 的方式特意指定了 CS&#xff08;代码段寄存器&#xff09;&#xff0c;因此可以成功读取 msg的内容。但在显示字符串时&#xff0c;由于无法指定段地址&#xff0c;程序误以为是 DS而从完全错误的内存地…

ChatGPT:你真的了解网络安全吗?浅谈攻击防御进行时之传统的网络安全

ChatGPT&#xff08;全名&#xff1a;Chat Generative Pre-trained Transformer&#xff09;&#xff0c;美国OpenAI 研发的聊天机器人程序&#xff0c;是人工智能技术驱动的自然语言处理工具。 基于其语言模型庞大、可控制、具有高度扩展性的特点&#xff0c;本文通过对话Chat…

111期_C++_2024年1月份作业博客_选择题错题总结

一、野指针问题&#xff1a;在定义的时候没有初始化&#xff0c;就不能能用scanf 或 printf 二、一个变量出现在表达式的两边作为两个不同的操作数&#xff0c; 并且其中一个操作数带有&#xff0c;此时表达式出现歧义 三、两端出栈问题&#xff1a; 错因&#xff1a;未理解题…

素皮材质的手机壳,如何才能做到经久耐用?

近几年&#xff0c;素皮材质开始在手机背壳上开始应用&#xff0c;各家手机厂商&#xff0c;基本都给自己的旗舰系列设备推出了带素皮材质版本的手机款式&#xff0c;比如华为的Mate 60系列&#xff0c;不仅Pro版本有素皮材质&#xff0c;Pro版本更是黑白两款全是素皮材质。 那…

Docker的基础知识与应用技巧

文章目录 一.docekr简介二.docekr安装三.docker命令 一.docekr简介 Docker是一个开源的应用容器引擎&#xff0c;它可以让开发者打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的Linux或Windows操作系统的机器上。Docker基于轻量级虚拟化技术&a…

交易这条路,没有永远的大神,唯有攀登者

一、摆平心态 很多人一谈及金融&#xff0c;首先想到的就是赚钱&#xff0c;而忽视了亏损和风险的存在。面对亏损时&#xff0c;许多人不是选择止损&#xff0c;而是选择加仓&#xff0c;希望通过大赚一笔来弥补损失。然而&#xff0c;这种做法往往会让他们在市场中受到惨痛的教…

桥接模式(Bridge Pattern) C++

上一节&#xff1a;适配器模式&#xff08;Adapter Pattern&#xff09; C 文章目录 0.理论1.组件2.使用场景 1.实践 0.理论 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;它的核心思想是将抽象部分与其实现部分分离&#xff0c;使它们可…

mac打不开xxx软件, 因为apple 无法检查其是否包含恶意

1. 安全性与隐私下面的允许来源列表&#xff0c;有些版本中的‘任何来源’选项被隐藏了&#xff0c;有些从浏览器下载的软件需要勾选这个选项才能安装 打开‘任何来源’选项 sudo spctl --master-disable 关闭‘任何来源’选项 sudo spctl --master-enable

leetcode 2.27

leetcode hot 100 哈希1.字母异位词分组2.最长连续序列 双指针1.盛最多水的容器2.和为 K 的子数组 数组1.除自身以外数组的乘积 哈希 1.字母异位词分组 49. 字母异位词分组 方法一&#xff1a;排序 由于互为字母异位词的两个字符串包含的字母相同&#xff0c;因此对两个字符…

Ribbon负载均衡:提升应用性能与可靠性的秘密武器(一)

本系列文章简介&#xff1a; 本系列文章将深入探讨Ribbon负载均衡的工作原理、应用场景和实践经验&#xff0c;帮助大家更好地理解和应用这一强大的技术。通过合理配置和优化Ribbon负载均衡&#xff0c;您可以为您的应用带来更高的性能和可靠性&#xff0c;从而获得竞争优势并满…

nginx---------------重写功能 防盗链 反向代理 (五)

一、重写功能 rewrite Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求&#xff0c;此功能依靠 PCRE(perl compatible regular expression)&#xff0c;因此编译之前要安装PCRE库&#xff0c;rewrite是nginx服务器的重要功能之一&#xff0c;重写功能(…

React回顾

一、基础 1、使用babel解析 2、不直接使用jsx&#xff0c;jsx写起来很繁琐 3、jsx语法规则 4、函数式组件的使用 5、函数式组件渲染 6、类组件渲染 7、类组件中事件调用this指向问题 8、类组件不能直接改变状态 9、props接收数据类型限制 类型限制放到类组件内部&#xff0c;用…

汽车油封的重要性

在汽车运行中&#xff0c;某些部件&#xff0c;如发动机或变速箱&#xff0c;相当于主角。然而&#xff0c;也有一些小不点在幕后发挥着至关重要的作用。不起眼的油封就是这样的组件之一。 1、油封的作用 油封&#xff0c;也称为旋转轴密封件&#xff0c;是提高汽车性能的重要…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的生活垃圾检测与分类系统(Python+PySide6界面+训练代码)

摘要&#xff1a;本篇博客详细讲述了如何利用深度学习构建一个生活垃圾检测与分类系统&#xff0c;并且提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并进行了与前代算法YOLOv7、YOLOv6、YOLOv5的细致对比&#xff0c;展示了其在图像、视频、实时视频流和批量…

刷题第六天

代码随想录刷题第六天 | 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和 454.四数相加II 这个题分完组之后和两数其实差不多 得重新复习STL了&#xff0c;好多东西全忘了&#xff0c; class Solution { public:int fourSumCount(vector<int>& nums1, vect…

Day03:Web架构OSS存储负载均衡CDN加速反向代理WAF防护

目录 WAF CDN OSS 反向代理 负载均衡 思维导图 章节知识点&#xff1a; 应用架构&#xff1a;Web/APP/云应用/三方服务/负载均衡等 安全产品&#xff1a;CDN/WAF/IDS/IPS/蜜罐/防火墙/杀毒等 渗透命令&#xff1a;文件上传下载/端口服务/Shell反弹等 抓包技术&#xff1a…

非线性优化资料整理

做课题看了一些非线性优化的资料&#xff0c;整理一下&#xff0c;以方便查看&#xff1a; 优化的中文博客 数值优化|笔记整理&#xff08;8&#xff09;——带约束优化&#xff1a;引入&#xff0c;梯度投影法 (附代码)QP求解器对比对于MPC的QP求解器 数值优化| 二次规划的…

Flask中使用日志库loguru

文章目录 README.mdapp.pyconfig.py参考资料 关于日志记录库loguru的介绍&#xff0c;具体可参见之前的博客&#xff1a;Python日志记录库——loguru 今天来介绍下&#xff0c;如何在Flask中使用loguru日志库。 README.md This is a simple example of how to use loguru in…

【Godot4自学手册】第十七节主人公的攻击和敌人的受伤

本节主要学习主人公是如何向敌人发起进攻的&#xff0c;敌人是如何受伤的&#xff0c;受伤时候动画显示&#xff0c;击退效果等。其原理和上一节内容相同&#xff0c;不过有许多细节需要关注和完善。 一、修改Bug 在本节学习之前&#xff0c;我将要对上一节的代码进行完善&am…

租赁系统|租赁软件提供免押金等多种租赁方式

租赁小程序是一种全新的租赁模式&#xff0c;为用户提供了免押金、多种租赁方式、定制化服务等多项优势&#xff0c;让用户的租赁体验更加美好。让我们来了解一下它的特点和功能。 首先&#xff0c;租赁小程序支持租完即送&#xff0c;无需等待固定租期。它提供了多种租赁方式&…