Java 枚举类型深入解析

在Java中,枚举(enum)是一种特殊的数据类型,它允许一个变量是预定义的常量集合中的一个值。枚举类型在许多场景中都非常有用,比如定义一组明确的常量、简化代码的可读性和维护性等。本文将详细讲解Java中的枚举类型,帮助你深入理解其特性和用法。

什么是枚举

枚举(Enumeration)是Java中的一个关键字,用于声明一组命名常量。枚举类型中的每个枚举常量都是该类型的一个实例。

枚举的基本用法

枚举的基本形式如下:

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

我们可以像使用类一样使用枚举:

public class EnumDemo {public static void main(String[] args) {Day today = Day.MONDAY;switch (today) {case MONDAY:System.out.println("Today is Monday");break;case TUESDAY:System.out.println("Today is Tuesday");break;// 其他情况default:System.out.println("Other day");break;}}
}

枚举中的方法

枚举类型不仅仅是常量集合,它们还可以包含方法。以下是一个包含构造方法、字段和方法的枚举示例:

public enum Planet {MERCURY(3.303e+23, 2.4397e6),VENUS(4.869e+24, 6.0518e6),EARTH(5.976e+24, 6.37814e6),MARS(6.421e+23, 3.3972e6),JUPITER(1.9e+27, 7.1492e7),SATURN(5.688e+26, 6.0268e7),URANUS(8.686e+25, 2.5559e7),NEPTUNE(1.024e+26, 2.4746e7);private final double mass;   // in kilogramsprivate final double radius; // in metersPlanet(double mass, double radius) {this.mass = mass;this.radius = radius;}public double mass() {return mass;}public double radius() {return radius;}// 计算重力public double surfaceGravity() {final double G = 6.67300E-11;return G * mass / (radius * radius);}public double surfaceWeight(double otherMass) {return otherMass * surfaceGravity();}
}public class EnumDemo {public static void main(String[] args) {double earthWeight = 75;double mass = earthWeight / Planet.EARTH.surfaceGravity();for (Planet p : Planet.values()) {System.out.printf("Weight on %s is %f%n", p, p.surfaceWeight(mass));}}
}

枚举的高级用法

实现接口

枚举可以实现一个或多个接口。以下是一个示例:

interface Behaviour {void action();
}public enum Animal implements Behaviour {DOG {@Overridepublic void action() {System.out.println("Barks");}},CAT {@Overridepublic void action() {System.out.println("Meows");}},LION {@Overridepublic void action() {System.out.println("Roars");}}
}public class EnumDemo {public static void main(String[] args) {for (Animal animal : Animal.values()) {System.out.print(animal.name() + ": ");animal.action();}}
}
枚举中的抽象方法

枚举还可以包含抽象方法,每个枚举常量必须实现这些方法:

public enum Operation {PLUS {double apply(double x, double y) {return x + y;}},MINUS {double apply(double x, double y) {return x - y;}},TIMES {double apply(double x, double y) {return x * y;}},DIVIDE {double apply(double x, double y) {return x / y;}};abstract double apply(double x, double y);
}public class EnumDemo {public static void main(String[] args) {double x = 4;double y = 2;for (Operation op : Operation.values()) {System.out.printf("%f %s %f = %f%n", x, op, y, op.apply(x, y));}}
}

枚举的优点

  1. 类型安全:枚举提供了类型安全的常量集合,避免了传统常量定义(如public static final)的类型转换问题。
  2. 可读性强:使用枚举可以使代码更加简洁、易读和易维护。
  3. 功能强大:枚举不仅仅是常量集合,还可以包含字段、方法和实现接口等,具有强大的功能扩展性。

总结

本文详细介绍了Java中的枚举类型,包括其基本用法、方法、构造方法、字段以及高级用法如实现接口和包含抽象方法等。通过这些知识,希望你能更好地理解和使用Java枚举,提高代码的可读性和维护性。

枚举类型是Java中一个强大且灵活的工具,掌握它们将对你的Java编程技能大有裨益。如果你有任何问题或建议,欢迎在评论区留言讨论!

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

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

相关文章

对比WPF和Avalonia的边框渲染差异

众所周知&#xff0c;诸如Border、Rectangle等元素&#xff0c;是具有边框的。但在WPF和Avalonia中&#xff0c;边框的渲染机制有所不同。 如下代码&#xff0c;Border的边框和背景色均为黑色&#xff0c;并且将透明度设为0.5&#xff1a; <Border Width"100" H…

模拟实现C++vector

一&#xff1a;C库中对于vector的介绍 vector的底层其实就是数据结构中的顺序表&#xff0c;顺序表的底层就是变长数组&#xff0c;是一段连续的物理空间 在下面的实现中&#xff0c;重点实现的是其中的迭代器和插入删除&#xff0c;下标访问等功能&#xff0c;模拟实现模板类…

BottomSheetDialog高度自适应,布局RecyclerView使用问题

public class CultureBottomDialogView {/*** 标题*/private static TextView textTitle;/*** 关闭按钮*/private static TextView textClose;/*** 列表*/private static RecyclerView recyclerView;private static BottomDialogAdapter dialogAdapter;private static List<…

15-JavaScript 中的 `call`、`apply` 和 `bind`

JavaScript 中的 call、apply 和 bind 笔记分享 在 JavaScript 中&#xff0c;函数作为一等公民&#xff0c;可以像其他对象一样被操作。这种特性使得我们可以通过特定的方法来控制函数的调用环境&#xff08;即 this 的值&#xff09;。call、apply 和 bind 是三个常用的方法…

消息队列RabbitMQ

1. 消息队列概述 1.1 什么是消息队列 消息队列是一种用于在分布式系统中传递消息的数据结构。它采用先进先出&#xff08;FIFO&#xff0c;First In First Out&#xff09;的方式进行数据存储和管理。消息队列能够解耦生产者和消费者&#xff0c;从而实现系统的松散耦合&#…

Flutter 视频播放利器:Chewie 的介绍与使用

在移动应用开发中&#xff0c;视频播放功能是常见的需求之一。Flutter 作为跨平台开发框架&#xff0c;其生态系统中有许多用于视频播放的插件。其中&#xff0c;Chewie 是一个非常受欢迎且功能强大的视频播放器插件&#xff0c;它是对官方 video_player 插件的包装&#xff0c…

Vue中使用vuex进行全局数据共享处理

1、简介 在之前的博文中&#xff0c;介绍了如何进行组件之间的数据传递&#xff0c;但是对于所有组件共享的变量来说&#xff0c;使用组件之间的数据传递实现复杂&#xff0c;因此本文引入vuex进行全局数据共享。 2、vuex的下载配置 2.1、vuex的下载 # 对于vue2来说&#xf…

第十六章 创建Web客户端 - 修改生成的客户端类

文章目录 第十六章 创建Web客户端 - 修改生成的客户端类修改生成的客户端类调整生成的类以处理极长的字符串 第十六章 创建Web客户端 - 修改生成的客户端类 修改生成的客户端类 生成 Web 客户端类后&#xff0c;通常不需要编辑该类。相反&#xff0c;可以编写代码来创建 Web …

IP地址开启HTTPS方法

可以使用IP地址申请SSL证书&#xff0c;申请之前必须是公网IP地址&#xff0c;不支持内网IP地址申请。 申请过程需要确定IP地址外网可以访问&#xff0c;这里特别注意只是申请过程中可以访问。访问验证过程必须采取80端口、443端口两者选择1个&#xff0c;不可以用其它端口进行…

下载视频怎么转换MP4?wmv转换mp4,推荐这3种方法

在数字化时代&#xff0c;我们经常需要从网上下载各种视频&#xff0c;但有时候下载的视频并不是我们想要的格式&#xff0c;比如WMV。为了能在更多的设备上播放或进行编辑&#xff0c;我们可能需要将其转换为更通用的MP4格式。 那么&#xff0c;下载的视频如何转换成MP4呢&am…

第三篇 编译器和译码器

实验三 编码器和译码器 3.1 实验目的 上一章节我们学习了简单组合逻辑电路——多路数据选择器&#xff0c;在本章节我们将学习另外一种数字系统中常见的简单组合逻辑电路——编码器和译码器。然后通过一个设计一个简易的计算器让大家进一步巩固FPGA开发的流程和方法。 本节您…

“神经网络之父”和“深度学习鼻祖”Geoffrey Hinton

“神经网络之父”和“深度学习鼻祖”Geoffrey Hinton在神经网络领域数十年如一日的研究&#xff0c;对深度学习的推动和贡献显著。 一、早期贡献与突破 反向传播算法的引入&#xff1a;Hinton是将反向传播&#xff08;Backpropagation&#xff09;算法引入多层神经网络训练的…

【C++进阶】深入STL之vector:构建高效C++程序的基石

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;模拟实现string &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀STL之vector &#x1f4d2;1.ve…

网络编程(七)

网络编程&#xff08;七&#xff09; UNIX域套接字&#xff08;本地间进程间通信的技术&#xff09;&#xff08;S文件&#xff09;基于TCP传输基于UDP传输 UNIX域套接字&#xff08;本地间进程间通信的技术&#xff09;&#xff08;S文件&#xff09; socket同样也可以用于本…

OpenCV-绘制虚线

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 功能函数 // 绘制虚线 void DrawDottedLine(cv::Mat &input, cv::Point p1, cv::Point p2, cv::Scalar color, int thickne…

Android Graphics 显示系统 - Android Jank detection with FrameTimeline

“ 最近有公司同事在处理UI卡顿及FPS自动化监测的问题&#xff0c;我也顺便看了一点相关的内容&#xff0c;其中在Perfetto的官方说明文档中有一篇关于利用FrameTimeLine进行Jank监测的解读&#xff0c;个人觉得蛮有意思的&#xff0c;借助工具翻译该篇文章并加上本人拙劣的解读…

C++系列-类模板

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 类模板的定义格式&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; template<class T> class Stack { public:Stack(size_…

【Java EE】网络原理——HTTPS

目录 1.HTTPS是什么 2.“加密”是什么 3.HTTPS的工作过程 3.1引入对称加密 3.2 引入非对称加密 4.中间人攻击 5.引入证书 6. 理解数据签名 7.通过证书解决中间人攻击 7.1 查看浏览器的授信任证书发布机构 7.2 中间人有没有可能篡改证书&#xff1f; 7.3 中间人整个掉…

解释Java中的反射API

一、技术难点 Java中的反射API允许程序在运行时获取类的内部信息&#xff0c;并可以操作这些类的字段、方法和构造器。虽然反射为Java程序员提供了极大的灵活性&#xff0c;但同时也带来了一些技术上的难点和挑战&#xff1a; 性能问题&#xff1a;反射操作相比直接操作对象通…

LeetCode 每日一题 数学篇 2965.找出缺失和重复的数字

给你一个下标从 0 开始的二维整数矩阵 grid&#xff0c;大小为 n * n &#xff0c;其中的值在 [1, n2] 范围内。除了 a 出现 两次&#xff0c;b 缺失 之外&#xff0c;每个整数都 恰好出现一次 。 任务是找出重复的数字a 和缺失的数字 b 。 返回一个下标从 0 开始、长度为 2 …