Java中枚举类概念说明

Java基础之Java枚举 絮叨 昨天刚好有遇到一个枚举的小问题,然后发现自己并不是那么熟悉它,然后在开发中,枚举用的特别多,所以有了今天的文章。 什么是枚举 Java中的枚举是一种类型,顾名思义:就是一个一个列举出来。所以它一般都是表示一个有限的集合类型,它是一种类型,在维基百科中给出的定义是: 在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠.。枚举是一个被命名的整型常数的集合,枚举在日常生活中很常见,例如表示星期的SUNDAY、MO 阅读详情
枚举类入门

  在某些情况下,一个类的对象是有限且固定,比如季节类,它只有4个对象;再比如行星类,目前只有8个对象。这种实例有限而且固定的类,在Java里被称为枚举类。
  Java5新增了一个enum关键字(它与class,interface关键字的地位相同),用以定义枚举类。正如前面所看到的,枚举类是一种特殊的类,它一样可以有自己的成员变量、方法,可以实现一个或者多个接口,也可以定义自己的构造器。一个Java源文件最多只能定义一个public访问权限的枚举类,且该Java源文件也必须和该枚举类的类名相同。

  但枚举类终究不是普通类,它与普通类有如下简单区别。

  • 枚举类可以实现一个或多个接口,使用enum定义的枚举类默认继承了java.lang.Enum类,而不是默认继承Object类,因此枚举类不能显式继承其它父类。其中java.lang.Enum类实现了java.lang.Serializable和java.lang.Comparable两个接口。
  • 使用enum定义非抽象的枚举类默认会使用final修饰,因此枚举类不能派生子类。
  • 枚举类的构造器只能使用private访问控制符,如果省略了构造器的访问控制符,则默认使用private修饰;如果强制指定访问控制符,则只能指定private修饰符。
  • 枚举类的所有实例必须在枚举类的第一行显式列出,否则这个枚举类永远都不能产生实例。列出这些实例时,系统会自动添加public static final修饰,无须程序员显式添加。

额外说明:枚举类默认提供了一个values()方法,该方法可以很方便地遍历所有的枚举值。如下所示,其中SeasonEnum 为下面定义的枚举类

for(SeasonEnum s:SeasonEnum.values()){
	sout(s);
}

下面程序定义了一个SeasonEnum枚举类。

public enum SeasonEnum{
    	// 在第一行列出4个枚举实例
    	SPRING,SUMMER,FALL,WINTER;
    	}

  编译上面Java程序,将生成一个SeasonEnum.class文件,这表明枚举类是一个特殊的Java类。由此可见,enum关键字和class、interface关键字的作用大致类似。
  定义枚举类时,需要显式列出所有的枚举值,如上面的SPRING,SUMMER,FALL,WINTER;所示,所有的枚举值之间以英文逗号(,)隔开,枚举值列举结束后以英文分号作为结束。这些枚举值代表了该枚举类的所有可能的实例。
  如果需要使用该枚举类的某个实例,则可以使用EnumClass.variable的形式,如SeasonEnum.SPRING。也可以调用方法valueOf,具体如下:

    SeasonEnum seasonEnum1 = Enum.valueOf(SeasonEnum.class,"SPRING");
    SeasonEnum seasonEnum2 = SeasonEnum.valueOf("SPRING");
    SeasonEnum seasonEnum3 = SeasonEnum.SPRING;
枚举类的成员变量、方法和构造器

  枚举类也是一种类,只是它是一种比较特殊的类,因此它一样可以定义成员变量、方法和构造器。下面程序将定义一个Gender枚举类,该枚举类里包含了一个name实例变量。

	public enum Gender{
		MALE,FEMALE;
		private String name;
		public String getName() {
        	return name;
    	}

    	public void setName(String name) {
        	this.name = name;
    	}
	}

  对于里面的实例变量name,我们可以通过获取Gender枚举类的对象来进行调用,如下。

public class GenderTest{
	public static void main(String[] args){
			// 这里获取Gender对象(实例)使用上述3个方法都可以
			Gender g = Enum.valueOf(Gender.class,"MALE");
			g.setName("男");
		}
	}

  但是上述代码依然有可能存在问题,如获取的是MALE对象,但是设置name时却设置成了女。这样就存在问题了。同时枚举类通常应该设计成不可变类,也就是说,它的成员变量值不应该允许改变,这样会更安全,而且代码更加简洁。因此建议将枚举类的成员变量都使用private final修饰。
  如果将所有的成员变量都使用了final修饰符来修饰,所以必须在构造器里为这些成员变量指定初始值(或者在定义成员变量时指定默认值,或者在初始化块中指定初始值,但这两种情况并不常见),因此应该为枚举类显式定义带参数的构造器。
  一旦为枚举类显式定义了带参数的构造器,列出枚举值时就必须对应地传入参数。

public enum Gender{
	// 此处的枚举值必须调用对应的构造器来创建
	MALE("男"),FENALE("女");
	private final String name;
	// 枚举类的构造器只能使用private修饰
	private Gender(String name){
		this.name = name;
	}
	public String getName(){
		return this.name;
	}
}

  从上面程序中可以看出,当为Gender枚举类创建了一个Gender(String name)构造器之后,列出枚举值就应该采用第三行代码来完成。也就是说,在枚举类中列出枚举值时,实际上就是调用构造器创建枚举类对象,只是这里无须使用new关键字,也无须显式调用构造器。前面列举出枚举值是无须传入参数,甚至无须括号,仅仅是因为前面的枚举类包含无参数的构造器。
  不难看出,上面程序第三行的代码实际上等同于如下两行代码:

public static final Gender MALE = new Gender("男");
public static final Gender FEMALE = new Gender("女");
实现接口的枚举类

  这里主要是想介绍下每个枚举值(或者说是枚举实例)实现接口方法可以表现出不同的行为方式。代码示例如下。

public enum Gender implements GenderInfo{
	// 此处的枚举值必须自动阿勇对应的构造器来创建
	MALE("男"){
		public void info(){
			sout("这个枚举值代表男性");
		}
	},
	FEMALE("女"){
		public void info(){
			sout("这个枚举值代表女性");
		}
	}
}

  上面代码看起来有些奇怪:当创建MALE和FEMALE两个枚举值时,后面又紧跟了一堆花括号,这对花括号包含了一个info()方法定义。如果读者还记得匿名内部类语法的话,则可能对这样的语法有点印象了,花括号部分实际上就是一个类体部分,在这种情况下,当创建MALE、FEMALE枚举值时,并不是直接创建Gender枚举类的实例,而是相当于创建Gender的匿名子类的实例。因为上面代码75-77和80-82行实际上是匿名内部类的类体部分,所以这个部分的代码语法就和匿名内部类语法大致相似,只是它依然是枚举类的匿名内部子类。
  编译上面的程序,可以看到生成了Gender.class、Gender$1.class和Gender$2.class三个文件,这样的三个class文件正好证明了上面的结论:MALE和FEMALE实际上是Gender匿名子类的实例,而不是Gender类的实例。
  特别说明:并不是所有的枚举类都使用了final修饰!非抽象的枚举类才默认使用final修饰。对于一个抽象的枚举类而言----只要它包含了抽象方法,它就是抽象枚举类,系统会默认使用abstract修饰,而不是使用final修饰。因此枚举类里定义抽象方法时不能使用abstract关键字将枚举类定义成抽象类,因为系统已自动为它添加了abstract关键字,但因为枚举类需要显式创建枚举值(枚举实例),而不是作为父类,所以定义每个枚举值(枚举实例)时必须为抽象方法提供实现,否则将出现编译错误。
  本文主要参考自疯狂java讲义第四版中关于枚举讲解的内容,如若侵权,请联系删除。

java枚举类型说明 java枚举类型的说说明,详细阐述了枚举类型的使用和注意事项 立即下载

相关推荐

枚举类型的说明 enum

详细说明了枚举类型,枚举类型是JDK5.0的新特征。Sun引进了一个全新的关键字enum来定义一个枚举类。

深入探究Java中的枚举类型:定义、特性和应用

枚举类型是一种特殊的数据类型,用于定义一组具名的常量。枚举类型在Java中被称为enum,它允许我们将一组相关的常量组织在一起,并为这些常量赋予可读性更强的名称。简单枚举类型是最基本的枚举类型,它包含一组枚举常量,每个常量都有一个唯一的名称。枚举类型可以用于定义常量集合,例如颜色、国家、字典等。通过枚举,可以统一管理和访问这些常量。本文深入探讨了Java中的枚举类型,包括定义枚举、枚举常量的特性、使用枚举的好处以及实际应用案例。

算命de博客 1420

超详细 VMware Horizon 虚拟桌面VDI安装步骤

主要的目的是模拟生产环境中的共享存储。自动桌面相当于共享电脑,大家使用同一个虚拟机,对虚拟机的修改都放在用户的配置文件中,RDS桌面池相当于共享的服务器,可以多人同时连接到服务器上。1:之前已经建立好了NFS的存储,这部分配置好后,以后的虚拟机可以安装到NFS的存储中。2: 使用Composer发布系统可以解决SID,机器名冲突的问题,更重要的可以节约磁盘空间,发布的所有系统可以访问一块磁盘。26: 域选择我们之前建立的域,用户名我输入的是管理员,可以在AD域新建用户点击查找,我这里用的是管理员。

vv12345的博客 1万+

从初学者到专家:Java枚举的完整指南

枚举是一种特殊的数据类型,用于表示一组有限的命名常量。它的优点包括类型安全性、可读性、可维护性和易于扩展,同时还简化了单例模式的实现。枚举常量是唯一的、不可变的,可以在编译时进行检查,减少错误的发生。枚举类型可以具有自定义的方法,提供了一种组织常量和相关行为的方式。枚举还可以支持可迭代和比较操作,方便进行遍历和比较枚举常量。

LHY537200的博客 5342

【win10+RAGFlow+Ollama】搭建本地大模型助手(教程+源码)

在当今科技飞速发展的时代,人工智能(AI)已经成为各行各业不可或缺的一部分。特别是在文档处理和数据分析领域,AI的应用更是无处不在。今天,我要向大家介绍一个开源的AI框架引擎——RAGflow。它能够在深度文档理解方面执行检索增强生成(Retrieval-Augmented Generation,简称RAG),并且被认为是目前最优秀的RAG框架之一。本文将详细探讨RAGflow的创新功能、技术特点以及如何在实际应用中发挥其最大潜力。

Yooao的博客 9618

树莓派5使用CSI摄像头 | 树莓派5接上CSI摄像头后命令行操作显示检测无设备

此系列用于记录树莓派5的一些操作,这篇文章讲述树莓派5如何使用CSI摄像头。

beyourself_he的博客 8795

深入理解【枚举】:从基础概念到实际例题

Java 中的枚举

m0_73494933的博客 643

【Bug已解决】Codex CLI 报错 apply_patch 失败:无法应用补丁的解决方案

方案适用场景推荐指数统一换行符规范跨平台协作项目的标准配置⭐⭐⭐⭐⭐关闭自动格式化冲突IDE 与 Codex 并发编辑同一文件⭐⭐⭐⭐缩小任务改动范围长期有效的使用习惯优化⭐⭐⭐⭐⭐统一 UTF-8 编码涉及非 UTF-8 遗留文件的项目⭐⭐⭐提示重新读取文件单次失败后的快速恢复方式⭐⭐⭐⭐报错的本质是Codex 生成补丁时读取的文件内容,与实际应用补丁时磁盘上的文件内容出现了不一致,常见诱因包括换行符风格混用、文件被其他工具并发修改、编码问题等。

一键难忘的博客 7290

Java 枚举(enum)剖析

目录 Java 枚举(enum)概述 枚举常量 属性与方法 枚举参数 实现接口 抽象方法 Java 枚举(enum)概述 1、Java JDK 1.5 新增的 enum 关键词,可以定义枚举类,如 public enum WeekEnum { }. 2、使用 enum 定义后的枚举类在编译后默认继承 java.lang.Enum 类,而不是普通的继承 Object 类。由于 Ja...

蚩尤后裔-汪茂雄 8405

5大步骤!轻松玩转Dorisoy.Rigger:基于.NET Core 6、MAUI和Blazor的多数据库开发框架生成器

各位小伙伴,你们是否厌倦了每次项目启动都要从头配置数据库连接、编写重复的代码?今天,我们就来聊聊如何使用Dorisoy.Rigger这个强大的开发框架生成器,让你的.NET Core 6、MAUI和Blazor项目开发变得简单又高效!准备好迎接开发的新乐趣了吗?让我们一起开始吧!接下来,我们需要定义数据模型。假设我们有一个简单的用户表,包含ID、用户名和密码字段。在项目中创建一个新的类文件,命名为User.csset;set;set;这段代码定义了一个用户模型,其中包含了用户的ID、用户名和密码。

java专栏 1738

PY32F406K1CU6 FLASH模拟EEPROM

摘要:本文介绍了基于STM32 FLASH模拟EEPROM的实现方法。头文件flash.h定义了FLASH页大小(256字节)、用户存储区域(4页)及地址范围,提供了等待周期配置和地址校验宏,声明了EEPROM初始化、读写操作等函数接口。源文件flash.c实现了具体功能:配置FLASH等待周期(144MHz需3WS)、页读写擦除操作,以及EEPROM初始化(解锁-擦除-验证-锁定)和缓冲区读写功能。其中写操作采用"读页→更新→擦除→编程"的流程,确保数据安全写入。该方案适用于需要非易失

sam的博客 194

JAVA中的枚举类

枚举类型就是多例,一个类有多个实例,但是实例的个数不是无穷的,是有限的;枚举类中实例称为枚举项,一般一个枚举类不应该有太多的枚举项。使用enum关键字,例如注意:定义枚举类型的关键字是enum,而不是Enum,所有关键字都是小写的。其中 FRONT,BEHIND,LEFT,RIGHT 都是枚举项,它们都是本类的实例,也就是说本类只有四个对象。在定义枚举项时,多个枚举项之间用逗号隔开,最后一个用分号结尾,如果枚举类型中只有枚举项(没有构造器、方法、变量),那么可以省略分号,但是不建议省。

lzping_719的专栏 688

5-EP4CE10F17C8-引脚配置

EP4CE10F17C8-引脚配置

weixin_44479192的博客 719

为什么需要枚举类_枚举类是什么_枚举类和普通类有什么区别

为什么需要枚举类 枚举类是什么 枚举类和普通类有什么区别

weixin_57604284的博客 1019

基于OpenClaw的AI数字员工协同团队架构设计

随着大型语言模型从被动的文本生成器向具备自主规划与执行能力的智能代理演进,企业级人工智能的应用范式正在发生根本性转变。在这一演进过程中,OpenClaw(前身为Clawdbot及Moltbot)作为一种开源的、本地优先的个人AI智能体网关基础设施,凭借其对持续内存、多通道接入以及沙盒化工具执行的原生支持,迅速成为构建“始终在线”数字劳动力的核心框架 1。然而,将单体个人助理扩展为能够处理复杂业务逻辑、支持跨组织协同并严格保障数据隔离的多智能体(Multi-Agent)团队,绝非简单的API拼接。系统架构必须

形上得其象,形下合于数;阴阳自济,玄理自明。 1047

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java 枚举类详解

枚举类(enum)是 Java 中用于表示一组常量的特殊类。每个枚举常量在内部是Enum类的一个实例对象。枚举常量不可变,并且它们在 JVM 中是单例的,即每个枚举常量在整个程序中只有一个实例。//默认调用无参构造器在EnumTestINSERT和UPDATE。这些常量默认调用无参构造器,且它们是EnumTest类的实例。在Size枚举类中,每个枚举常量都有一个额外的字段,用来表示它的缩写。该类有一个带参数的构造器,用于为每个枚举常量设置缩写。

m0_73700203的博客 481

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

枚举类相关

Java枚举类是通过enum关键字定义的特殊类,用于限定固定数量的对象实例。枚举类继承自java.lang.Enum,采用私有构造器防止外部实例化。基本定义包含枚举元素列表,支持添加属性、方法和构造方法,也可定义抽象方法(需由枚举元素实现)。典型应用场景如性别类(MALE/FEMALE),通过预定义元素保证类型安全。枚举类常用于简化常量定义,支持switch语句,并提供ordinal()等方法。实际开发中通常采用简单定义方式,偶尔扩展属性和方法。关键特性包括:枚举元素必须首行声明、构造器必须私有、可包含抽象

m0_74906481的博客 993

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java基础--Enum(枚举类)

可以创建一个enum类,把它看做一个普通的类。除了它不能继承其他类了。(java是单继承,它已经继承了Enum),可以添加其他方法,覆盖它本身的方法switch()参数可以使用enumvalues()方法是编译器插入到enum定义中的static方法,所以,当你将enum实例向上转型为父类Enum是,values()就不可访问了。

qq_43659871的博客 1795

枚举类小结

<br />枚举类小结<br />引子<br />Java 1.4以前的版本并没有提供枚举类型的支持<br />从Java 5.0(代号为Tiger)开始,这种情况改变了,Java从语言层面支持了枚举类型。枚举是Tiger的一个很重要的新特性,它是一种新的类型,允许用常量来表示特定的数据片断,而且全部都以类型安全的形式来表示,它使用“enum”关键字来定义。我们先来写一个简单的枚举类型的定义: public enum WeekDay{ MONDAY, TUESDAY, WENSDAY, THURSDAY,

ing 708

枚举类详解(精髓)

(1)枚举类的构造方法一定是私有的,因为可以通过 来创建对象MyEnum.RED。(2)RED(“红色”)表示创建对象的时候调用的构造函数传入的参数是“红色”因为枚举类的实例化对象是有限个。那么他们就会要有对应的构造方法。有的时候一个类的对象是有限且固定的,这种情况下我们使用。枚举类内也可以定义属性和方法,可是是静态的和非静态的。实例有限且固定不变的类,Java将其称为。枚举类实现接口和普通类有什么不同?为什么我们要用枚举类?枚举类可以定义方法吗?

Garson的博客 413

枚举类Enum

一、枚举类的使用 1.枚举类的理解:类的对象只有有限个,确定的。我们称此类为枚举类 2.当需要定义一组常量时,强烈建议使用枚举类 3.如果枚举类中只有一个对象,则可以作为单例模式的实现方式。 二、如何定义枚举类 方式一:jdk5.0之前,自定义枚举类 方式二:jdk5.0,可以使用enum关键字定义枚举类 三、Enum类中的常用方法: values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。 valueOf(String str):可以把一个字符串转为对应的枚举类对象。要

qq_45922060的博客 705

Java枚举类型学习笔记总结

枚举 枚举类型是一种整型,它的作用一是让数据看起来更直观,二是将数据圈定一个范围。不支持继承。 数据看起来更直观,即将该类型含有的数据用变量的形式呈现出来。 将数据圈定一个范围,即将该类型所有包含的数据一一列举出来。 例如:在打开一个文具盒之前,里面可能含有什么东西无法知道,通过定义枚举的办法,将里面可能含有的铅笔和钢笔表示出来,即枚举的作用所在。 代码如下 /* 这里定义了枚举类型的 box,规定 box 里面只含有 PENCIL 和 PEN 两个元素 */ public enum Box{PENCI

weixin_44746876的博客 253

java 枚举类小结 Enum

好久没有接触枚举类了,差不多都忘了,今天抽出个时间总结一下吧。说实话,枚举类确实能够给我们带来很大的方便。 说明:枚举类它约定了一个范围,可以理解成只可以生成固定的几个对象让外界去调用,故枚举类中的构造方法都是private类型的。进而求其次,究竟枚举类到底有何特殊之处呢? 呈上代码一览(本人也是java Android 领域的菜鸟,如有错误之处,希望大家能够给以指点) 1 ...

weixin_30484247的博客 112

【深入Java枚举类:不仅仅是常量的容器】

本文主要介绍了枚举的基本概念以及使用方法,还有一些应用,如有错误,请大佬指出谢谢!!!

TheMyth142857的博客 797

枚举类型-java

枚举类型是一种特殊的类,它的实例对象只有有限几个常量对象,在枚举类的外部是不能创建它的对象,只能通过的方式来获取它的对象。

qq_74776071的博客 434

java枚举类!

Enum作为Sun全新引进的一个关键字,看起来很象是特殊的class, 它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口。 当我们在声明一个enum类型时,我们应该注意到enum类型有如下的一些特征。 1.它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例。 2.所有枚举值都是public , static , final的。注意这一点只是针对于

single_pen的专栏 1874
上一篇: 构造小时和天数的时间Map并返回
下一篇: java时区,时间处理类等概念总结
try_learner
博客等级 码龄9年 35粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值