Java 枚举enum类

Java枚举(Enum)

枚举

定义:

  • Java枚举是一种特殊的类,用来表示一组固定的常量。

  • 被enum关键字修饰的类型就是枚举类型

    (如果枚举不添加任何方法,枚举值默认为从0开始的有序数据。

比如定义一个枚举类表示季节,那里面有春、夏、秋和冬四个变量。

一个枚举类表示星期,那里面有星期一、星期二、星期三、星期四、星期五、星期六和星期日七个变量

枚举类表示月份就同理有十二个月、十二个变量。

  • 格式:

    • Java 枚举类使用 enum 关键字来定义,enum关键字的作用就像是classinterface
    • 各个常量使用逗号 , 来分割。注意最后一个枚举对象要使用“;”结尾,说明枚举值结束使用。
  • 1 枚举的本质:其实就是终止类,并继承Enum抽象类。

    2 枚举中的变量,其实就是一个当前类型的静态常量。

  • 枚举类型本质上是java.lang.Enum类的子类,(java.lang.Enum是一个抽象类)但Java中不支持多继承,因此枚举类型不能再继承其他类。

//测试类
public enum Season {       //上文说的季节类//每个成员变量都默认被 public final static修饰SPRING, SUMMER, AUTUMN, WINTER;
}
//测试类
public class SeasonTest {public static void main(String[] args) {for (Season seasonEnum : Season.values()) {System.out.println(seasonEnum+",ordinal:"+seasonEnum.ordinal()+",name:"+seasonEnum.name());}}
}
  • 每个被枚举的成员其实就是定义的枚举类型的一个实例,它们都被默认为final。无法改变常数名称所设定的值,它们也是public和static的成员,这与接口中的常量限制相同。可以通过类名称直接使用它们。

枚举中的方法

  • values() :返回enum实例的数组,而且该数组中的元素严格保持在enum中的声明时的顺序。

  • name():返回实例名。

  • ordinal():返回实例声明时的次序,从0开始

  • getDeclaringClass():返回实例所属的enum类型。

  • equals():判断是否为同一个对象

    也可以使用"=="来比较enum实例

  • valueOf():返回指定字符串值的枚举常量。

特性

  1. 除了不能继承,可以将enum看作一个普通类。
  2. Java不允许使用=为枚举常量赋值。
  3. enum通过方法来显式赋值
  4. enum可以添加普通方法、静态方法、抽象方法、构造方法。
  5. 枚举可以实现接口
  6. 枚举不可以继承

枚举类中定义抽象方法

既然编译器最终将每个枚举值声明为枚举类的实例,那我们能在枚举类中声明抽象方法让枚举值去实现么?

在枚举类Season中声明了一个抽象方法sayHello()。然后在创建枚举值时,就必须实现该抽象方法

public enum SeasonEnum {//枚举类的实例对象必须在最前面先定义,而且必须每个实例对象都必须维护上chinese成员变量SPRING("春天",1201){@Overridevoid sayHello() {System.out.println("hello spring");}},SUMMER("夏天",1202){@Overridevoid sayHello() {System.out.println("hello summer");}},AUTUMN("秋天",1203){@Overridevoid sayHello() {System.out.println("hello autumn");}},WINTER("冬天",1204){@Overridevoid sayHello() {System.out.println("hello winter");}};private String name;private Integer code;//枚举类型的构造函数默认为private,因为枚举类型的初始化要在当前枚举类中完成。SeasonEnum (String name,Integer code){this.name=name;this.code=code;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}abstract void sayHello();
}

测试类:

public class SeasonTest {public static void main(String[] args) {//直接初始化SeasonEnum season1 = SeasonEnum.SPRING;//调用SeasonEnum枚举类的sayHello方法season1.sayHello();}
}

控制台输出:

hello spring
  1. 枚举允许继承类吗?

    枚举类使用enum定义后在编译后默认继承了java.lang.Enum类,而不是普通的继承Object类。enum声明类继承了Serializable和Comparable两个接口。且采用enum声明后,该类会被编译器加上final声明(同String),故该类是无法继承的。

    所有枚举类都默认是Enum类的子类,无需我们使用extends来继承。

    1. 枚举允许实现接口吗?

    枚举允许实现接口。因为枚举本身就是一个类,类是可以实现多个接口的。

    public interface EnumInterface {public abstract void print();
    }
    public enum SizeEnum implements EnumInterface{BIG,MIDDLE,SMALL;@Overridepublic void print() {System.out.println("继承接口-重写方法一次");}
    }
    
    1. 枚举可以用等号比较吗?

    肯定,因为在Enum类里面,已经重写了equals方法,而方法里面比较就是直接使用==,来比较2个对象的。所以,你在外边直接使用==也是可以的。

    在这里插入图片描述

    1. 可以继承枚举吗?

    当然不能呀,枚举类默认继承了java.lang.Enum类,一个类怎么能继承两个类呢?

    1. 枚举可以实现单例模式吗?

    枚举本身就是一种对单例设计模式友好的形式,它是实现单例模式的一种很好的方式。

    public class InstanceDemo {/*** 构造方法私有化*/private InstanceDemo(){}/*** 返回实例* @return*/public static InstanceDemo getInstance() {return Singleton.INSTANCE.getInstance();}/*** 使用枚举方法实现单利模式*/private enum Singleton {INSTANCE;private InstanceDemo instance;/*** JVM保证这个方法绝对只调用一次*/Singleton() {instance = new InstanceDemo();}public InstanceDemo getInstance() {return instance;}}//测试一下public static void main(String[] args) {InstanceDemo one =  InstanceDemo.getInstance();InstanceDemo two =  InstanceDemo.getInstance();System.out.println(one);System.out.println(two);System.out.println(one == two);}
    }
    

    创建的对象相同

    csdn.test.recursion.demo.InstanceDemo@74a14482
    csdn.test.recursion.demo.InstanceDemo@74a14482
    true
    
    1. 当使用compareTo()比较枚举时,比较的是什么?

    int compareTo(E e):比较两个枚举常量谁大谁小,其实比较的就是枚举常量在枚举类中声明的顺序;返回值可以仔细看看源码;

    一起看看,底层代码吧

     public final int compareTo(E o) {Enum<?> other = (Enum<?>)o;Enum<E> self = this;if (self.getClass() != other.getClass() && // optimizationself.getDeclaringClass() != other.getDeclaringClass())throw new ClassCastException();return self.ordinal - other.ordinal;}
    

    举个例子你就能理解了

    public class TestSeasonEnum {public static void main(String[] args) {Season season = Season.SPRING;Season season1 = Season.SUMMER;Season season2 = Season.AUTUMN;Season season3 = Season.WINTER;System.out.println(season.compareTo(season1));System.out.println(season.compareTo(season2));System.out.println(season.compareTo(season3));}
    }
    

    输出结课,详情参考源码一看便知道

    -1
    -2
    -3

    1. 当使用equals()比较枚举的时候,比较的是什么?

    枚举类型的equals()方法比较的是枚举类对象的内存地址,作用与等号等价。

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

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

相关文章

【C语言】位操作符详解

目录 1、按位与&#xff08; & &#xff09; 2、按位或&#xff08; | &#xff09; 3.按位异或&#xff08; ^ &#xff09; C语言中的位操作符有以下&#xff1a; & | ^//按位与 //按位或 //按位异或 位运算符是计算两者之间的补码&#xff0c;然后得到的是计算后补…

防御保护----防火墙基本知识

一.防火墙的基本知识--------------------------------------------------------- 防火墙&#xff1a;可以想象为古代每个城市的城墙&#xff0c;用来防守敌军的攻击。墙&#xff0c;始于防&#xff0c;忠于守。从古至今&#xff0c;墙予人以安全之意。 防火墙的主要职责在于&…

ES实战回顾

1、你用的集群节点情况&#xff1f; 一个ES集群&#xff0c;18个节点&#xff0c;其中3个主节点&#xff0c;15个数据节点&#xff0c;500G左右的索引数据量&#xff0c;没有单独的协调节点&#xff0c;它的每个节点都可以充当协调功能&#xff1b; 2、你们常用的索引有哪些&a…

一个基于 .NET 7 + Vue.js 的前后端分离的通用后台管理系统框架 - DncZeus

前言 今天给大家推荐一个基于.NET 7 Vue.js(iview-admin) 的前后端分离的通用后台权限(页面访问、操作按钮控制)管理系统框架&#xff1a;DncZeus。 官方项目简介 DncZeus是一个基于 .NET 7 Vue.js 的前后端分离的通用后台管理系统框架。后端使用.NET 7 Entity Framework…

Mysql-事务(隔离级别,事务底层原理,MVCC)

什么是事务&#xff1f;有哪些特性&#xff1f; 事务&#xff1a;事务指的是逻辑上的一组操作&#xff0c;组成这组操作的各个单元要么全都成功&#xff0c;要么全都失败。 事务特性&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a; 原子性是指事务是一个不…

设计模式——2_0 职责链(Chain of Responsibility)

楼下一个男人并得要死&#xff0c;那家隔壁的一家唱着留声机&#xff0c;对面是弄孩子。楼上有两人狂笑&#xff1b;还有打牌声&#xff0c;河中的船上有女人哭她死去的母亲。人类的悲欢并不相通&#xff0c;我只觉得他们吵闹 ——鲁迅 文章目录 定义图纸一个例子&#xff1a;如…

谷歌人工智能视频生成器-LUMIERE(未开源)

Google重磅发布视频生成模型Lumiere 据说后续会开源 亮点1.支持文本到视频与图像到视频 亮点2.画风迁移 亮点3.运动蒙版 亮点4.视频编辑 亮点5.视频修复 谷歌视频模型可以生成80帧的片段&#xff01;不仅画质好、质量高&#xff0c;而且时长更长。 视频局部编辑 这项功能可以…

强化学习原理python篇06(拓展)——DQN拓展

强化学习原理python篇06&#xff08;拓展&#xff09;——DQN拓展 n-steps代码结果 Double-DQN代码结果 Dueling-DQN代码结果 Ref 拓展篇参考赵世钰老师的教材和Maxim Lapan 深度学习强化学习实践&#xff08;第二版&#xff09;&#xff0c;请各位结合阅读&#xff0c;本合集只…

【学习笔记】vue3的watch

尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通 课程 P152节 笔记&#xff1a; 情况一&#xff1a;监视ref所定义的一个响应式数据 情况二&#xff1a;监视ref所定义的多个响应式数据 这两种情况比较简单&#xff0c;正常写就ok&#xff1a; 情况三&#xff1a;监视reactive所…

关机恶搞小程序

1. system("shutdown")的介绍 当system函数的参数是"shutdown"时&#xff0c;它将会执行系统的关机命令。 具体来说&#xff0c;system("shutdown")的功能是向操作系统发送一个关机信号&#xff0c;请求关闭计算机。这将触发操作系统执行一系列…

MacOS安装反编译工具JD-GUI以及解决无法打开的问题

目录 一.下载地址 二.安装 三.问题 四.解决办法 1.显示包内容 2.找到Contents/MacOS/universalJavaApplicationStub.sh 3.修改sh文件 4.保存后再次打开即可 一.下载地址 Java Decompiler 二.安装 将下载下来的 jd-gui-osx-1.6.6.tar 解压&#xff0c;然后将 JD-GUI.a…

Hadoop3.x基础(1)

来源&#xff1a;B站尚硅谷 这里写目录标题 大数据概论大数据概念大数据特点(4V)大数据应用场景 Hadoop概述Hadoop是什么Hadoop发展历史&#xff08;了解&#xff09;Hadoop三大发行版本&#xff08;了解&#xff09;Hadoop优势&#xff08;4高&#xff09;Hadoop组成&#xf…

IntelliJ创建一个springboot工程

安装jdk mac教程 windows教程 安装maven mac教程 windows教程 建议&#xff1a; 在本地磁盘新建一个文件夹叫maven&#xff0c;然后把下载的maven安装到这里。在后续的IntelliJ操作中&#xff0c;配置maven的settings.xml和repository地址为这个目录下的地址。 创建sprin…

【架构】Docker实现集群主从缩容【案例4/4】

实现集群主从缩容【4/4】 接上一节&#xff0c;在当前机器为4主4从的架构上&#xff0c;减缩容量为3主3从架构。即实现删除6387和6388. 示意图如下&#xff1a; 第一步&#xff1a;查看集群情况&#xff08;第一次&#xff09; redis-cli --cluster check 127.0.0.1:6387roo…

c# Get方式调用WebAPI,WebService等接口

/// <summary> /// 利用WebRequest/WebResponse进行WebService调用的类 /// </summary> public class WebServiceHelper {//<webServices>// <protocols>// <add name"HttpGet"/>// <add name"HttpPost"/>// …

【Linux】fork()函数

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

Docker 安装篇(CentOS)

Docker社区版 Docker从1.13版本之后采用时间线的方式作为版本号&#xff0c;分为社区版CE和企业版EE。 社区版是免费提供给个人开发者和小型团体使用的&#xff0c;企业版会提供额外的收费服务&#xff0c;比如经过官方测试认证过的基础设施、容器、插件等。 1、Docker 要求 C…

深度强化学习(王树森)笔记08

深度强化学习&#xff08;DRL&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接&#xff1a;https://github.com/wangshusen/DRL 源代码链接&#xff1a;https://github.c…

校园圈子论坛系统--APP小程序H5,前后端源码交付,支持二开!uniAPP+PHP书写!

随着移动互联网的快速发展&#xff0c;校园社交成为了大学生们日常生活中重要的一部分。为了方便校园内学生的交流和互动&#xff0c;校园社交小程序逐渐走入人们的视野。本文将探讨校园社交小程序的开发以及其带来的益处。 校园社交小程序的开发涉及许多技术和设计方面。首先&…

安装elasticsearch、kibana、IK分词器

1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器&#xff0c;因此需要让es和kibana容器互联。这里先创建一个网络&#xff1a; docker network create es-net 1.2.加载镜像 这里我们采用elasticsearch的7.12.1版本的镜像&#xff0c;这个镜像体积非常大&#xff0…