枚举的定义及其使用

在Java中,enum(枚举)是一个特殊的类,用于表示一组常量。enum类型在Java中提供了一种类型安全的方式来定义常量,相比传统的常量(如public static final变量),它更加简洁、类型安全,并且可以包含字段、方法和构造函数。枚举类型继承自java.lang.Enum类,因此它们具有一些内置的方法,例如values()valueOf()

1. 枚举的基本定义

枚举用于定义一组常量。你可以通过enum关键字来定义一个枚举类型。每个枚举常量可以作为该枚举类型的一个实例。

public enum Day {SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY;
}

在这个例子中,Day枚举包含了一周的七天常量。每个常量都隐式是Day类型的一个实例。

2. 枚举的基本使用

枚举常量可以直接使用,枚举类型还提供了values()方法,它返回一个包含所有枚举常量的数组。

public class EnumExample {public static void main(String[] args) {Day day = Day.MONDAY;// 使用枚举常量switch (day) {case MONDAY:System.out.println("Start of the work week!");break;case SUNDAY:System.out.println("It's the weekend!");break;default:System.out.println("Mid-week");break;}// 输出所有枚举常量for (Day d : Day.values()) {System.out.println(d);}// 使用 valueOf 方法Day dayFromString = Day.valueOf("MONDAY");System.out.println("Day from String: " + dayFromString);}
}

输出:

Start of the work week!
SUNDAY
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
Day from String: MONDAY

3. 枚举可以有字段和方法

枚举不仅仅包含常量,还可以包含字段和方法。比如,你可以为每个枚举常量添加一些与之相关的数据,或者定义一些方法来处理这些数据。

public enum Direction {NORTH(0), EAST(90), SOUTH(180), WEST(270);private final int degree;// 构造函数Direction(int degree) {this.degree = degree;}public int getDegree() {return degree;}
}public class EnumWithMethods {public static void main(String[] args) {// 输出方向和它们的角度for (Direction direction : Direction.values()) {System.out.println(direction + " has degree: " + direction.getDegree());}}
}

输出:

NORTH has degree: 0
EAST has degree: 90
SOUTH has degree: 180
WEST has degree: 270

4. 枚举的常用方法

values() 方法

values()方法返回包含所有枚举常量的数组。你可以用它来遍历所有的枚举常量。

for (Day day : Day.values()) {System.out.println(day);
}
valueOf(String name) 方法

valueOf()方法将字符串转换为对应的枚举常量。如果传入的字符串与枚举常量名称不匹配,会抛出IllegalArgumentException

Day day = Day.valueOf("MONDAY");
System.out.println(day);  // 输出 MONDAY
ordinal() 方法

ordinal()方法返回枚举常量的序号(从0开始)。它表示枚举常量在声明时的顺序。

System.out.println(Day.MONDAY.ordinal());  // 输出 1

5. 枚举的构造函数

枚举常量可以有构造函数,你可以在构造函数中初始化枚举常量的字段。每个枚举常量都调用该构造函数进行初始化。

public enum Planet {MERCURY(3.303e+23, 2.4397e6), // 第一个常量VENUS(4.867e+24, 6.0518e6),   // 第二个常量EARTH(5.976e+24, 6.3781e6);   // 第三个常量private final double mass;   // 质量private final double radius; // 半径// 构造函数Planet(double mass, double radius) {this.mass = mass;this.radius = radius;}public double getMass() {return mass;}public double getRadius() {return radius;}public double surfaceGravity() {final double G = 6.67300E-11; // 引力常数return G * mass / (radius * radius);}public static void main(String[] args) {for (Planet p : Planet.values()) {System.out.printf("%s: mass = %.2e, radius = %.2e, gravity = %.2f%n",p, p.getMass(), p.getRadius(), p.surfaceGravity());}}
}

输出:

MERCURY: mass = 3.30e+23, radius = 2.44e+06, gravity = 3.70
VENUS: mass = 4.87e+24, radius = 6.05e+06, gravity = 8.87
EARTH: mass = 5.98e+24, radius = 6.38e+06, gravity = 9.81

6. 枚举与switch语句

你可以使用switch语句来基于枚举常量执行不同的代码块。由于枚举类型是类型安全的,switch语句可以确保只有枚举类型的常量才能用于比较。

public class EnumSwitchExample {public static void main(String[] args) {Day day = Day.WEDNESDAY;// 使用switch语句判断当天是周几switch (day) {case MONDAY:System.out.println("Start of the week!");break;case WEDNESDAY:System.out.println("Midweek!");break;case FRIDAY:System.out.println("Almost weekend!");break;default:System.out.println("Weekday!");}}
}

输出:

Midweek!

总结

  • 定义枚举类型:使用enum关键字可以定义枚举类型,表示固定的一组常量。
  • 字段和方法:枚举类型可以有字段和方法,用来处理与枚举常量相关的逻辑。
  • 内置方法values()方法返回所有枚举常量,valueOf()方法根据名称返回对应常量,ordinal()返回常量的序号。
  • 类型安全:枚举提供了一种类型安全的方式来处理常量,避免了传统常量方式可能导致的错误。

通过枚举,你可以在Java中轻松地表示一组常量,并且可以附加更多的逻辑,极大地增强了代码的可读性和可维护性。

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

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

相关文章

19681 01背包

19681 01背包 ⭐️难度:中等 🌟考点:动态规划、01背包 📖 📚 import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class Main {static int N 10001…

DeepSeek R1 本地部署指南 (2) - macOS 本地部署

上一篇: DeepSeek R1 本地部署指南 (1) - Windows 本地部署-CSDN博客 1.安装 Ollama Ollama https://ollama.com/ 点击 Download - Download for macOS 解压下载 zip 启动程序 3. 选择版本 DeepSeek R1 版本 deepseek-r1 https://ollama.com/library/deepseek-r1 模…

威联通 加载swoole记录

命令不是php -v是php7.4 php7.4 安装位置 查看ini路径 php-fpm7.4文件位置 /share/CACHEDEV2_DATA/.qpkg/PHP7.4/bin/ 创建软链接 可以在 /etc/init.d/ 目录下创建一个指向 /share/CACHEDEV2_DATA/.qpkg/PHP7.4/bin/php - fpm7.4 的软链接,这样系统就能识别…

启动方法jupyter(Anaconda)

原本我一直以为需要启动anaconda才能去开启jupyter,但是看到同学的windows可以直接通过菜单去开启并使用jupyter,所以我意识到开启jupyter不需要那么复杂。那么Linux中有没有更方便的方法去启动呢? 首先我们要知道anaconda仅仅是一个集成的环…

ManiWAV:通过野外的音频-视频数据学习机器人操作

24年6月来自斯坦福大学、哥伦比亚大学和 TRI 的论文“ManiWAV: Learning Robot Manipulation from In-the-Wild Audio-Visual Data”。 音频信号通过接触为机器人交互和物体属性提供丰富的信息。这些信息可以简化接触丰富的机器人操作技能学习,尤其是当视觉信息本身…

阿里云国际站代理商:如何构建交互式安全分析看板?

1.明确看板目的 在构建交互式安全分析看板之前,首先要明确看板的具体目的和目标用户。例如,是为了实时监控网络安全态势,还是为了分析历史安全事件。明确目的有助于确定看板上需要展示的关键指标和数据类型。 2.选择合适的数据可视化…

Linux固定IP方法(RedHat+Net模式)

1、查看当前网关 ip route | grep default 2、配置静态IP 双击重启 3、验证

Android音视频多媒体开源库基础大全

从事音视频开发工作,需要了解哪些常见的开源库,从应用到底软系统,整理了九大类,这里一次帮你总结完。 包含了应用层的MediaRecorder、surfaceView,以及常见音视频处理库FFmpeg和OpenCV,还有视频渲染和音频…

代码随想录算法训练营第十五天 | 数组 |长度最小的子数组和螺旋矩阵II

长度最小的子数组 【题目简介】 【自写数组解法】 class Solution:def minSubArrayLen(self, target: int, nums: List[int]) -> int:minLength float(inf)slow 0fast 0cur_sum nums[slow]# 终止条件&#xff1a;fast不能超过最大索引值while slow < fast and fas…

JVM常用概念之身份哈希码

问题 当我们调用Object.hashCode时&#xff0c;如果没有用户没有提供哈希码&#xff0c;会发生什么&#xff1f; System.identityHashCode如何工作&#xff1f;它是否获取对象地址&#xff1f; 基础知识 在 Java 中&#xff0c;每个对象都有equals和hashCode &#xff0c;即…

Compose 实践与探索十六 —— 与传统的 View 系统混用

Compose 发展初期的几年&#xff0c;会是新的模块用 Compose 写&#xff0c;然后逐渐的把老界面从 View 替换成 Compose 组件&#xff0c;直到全部或几乎全部是 Compose 代码的模式。 原生的 SurfaceView 与 TextureView 的重点是在它们底层的 Surface API&#xff0c;而不是 V…

[7-01-03].SpringBoot3集成MinIo

MinIO学习大纲 一、Spingboot整合MinIo 第1步&#xff1a;搭建SpringBoot项目&#xff1a; 第2步&#xff1a;引入minio依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi&q…

xLua_001 Lua 文件加载

xLua下载 1、HelloWrold 代码 using System.Collections; using System.Collections.Generic; using UnityEngine; using XLua; // 引入XLua命名空间 public class Helloworld01 : MonoBehaviour {//声明LuaEnv对象 private LuaEnv luaenv;void Start(){//实例化LuaEnv对象…

Redis 管道(Pipeline)深度解析:原理、场景与实战

一、为什么需要管道? 1. Redis 的请求/响应模式瓶颈 在传统 Redis 交互中: 客户端:发送命令1 → 等待响应 → 发送命令2 → 等待响应... 每次操作都需要经历: 网络传输时间 服务器处理时间 客户端阻塞等待时间 性能损耗:当需要执行大量命令时,频繁的网络往返(RTT)成…

OSPF-8 OSPF特殊区域NSSA

上一期我们介绍了特殊区域Stub区域,描述了Stub区域是如何来缩减LSA的数量以及下发LSA路由信息的 但由于Stub以及Stub区域虽然达到了缩减LSA数量的目的,但是无法引入外部路由信息所以这章我们来介绍OSPF的NSSA特殊区域,来看看NSSA区域与Stub区域有什么区别 一、概述 Stub区域与…

upload-labs靶场学习记录2

pass-2 打开靶场 提示这关与mime进行检查。 所以我们上传1.php文件并且抓包。 抓到包&#xff0c;我们修改对应的Content-Typed的类型为image/jpeg来伪造数据&#xff0c;让后端以为我们传入的是一个图片文件。 点击发送查看回传&#xff0c;复制图片的链接。 打开蚁剑&…

【C++】多态

目录 文章目录 前言 一、多态的概念 二、多态的定义及实现 三、重载/重写/隐藏的对比 四、纯虚函数和抽象类 五、多态的原理 总结 前言 本文主要讲述C中的多态&#xff0c;涉及的概念有虚函数、协变、纯虚函数、抽象类、虚表指针和虚函数表等。 一、多态的概念 多态分…

k8s部署prometheus+alertmanager+grafana监控

1、下载prometheus.yaml文件 根据github上面的版本对应说明&#xff0c;选择我们要下载的版本&#xff0c;github地址 rootiZj6c72dzbei17o2cuksmeZ:~# wget https://github.com/prometheus-operator/kube-prometheus/archive/refs/tags/v0.14.0.tar.gz rootiZj6c72dzbei17o2cu…

扩展卡尔曼滤波

1.非线性系统的线性化 标准卡尔曼滤波 适用于线性化系统&#xff0c;扩展卡尔曼滤波 则扩展到了非线性系统&#xff0c;核心原理就是将非线性系统线性化&#xff0c;主要用的的知识点是 泰勒展开&#xff08;我另外一篇文章的链接&#xff09;&#xff0c;如下是泰勒展开的公式…

【从0实现muduo库系列】第二讲:基础类型与工具类

0 章节重点 重点内容 视频讲解&#xff1a;《CLinux编程进阶&#xff1a;从0实现muduo C网络框架系列》-第2讲.基础类型与工具类 代码改动 cp -r lesson1 lesson2 实现&#xff1a;base/Types.h 实现&#xff1a;base/copyable.h和noncopyable.h 实现&#xff1a;base/Str…