你不会工作1年了连枚举都还不知道吧?
💗推荐阅读文章💗
- 🌸JavaSE系列🌸👉1️⃣《JavaSE系列教程》
- 🌺MySQL系列🌺👉2️⃣《MySQL系列教程》
- 🍀JavaWeb系列🍀👉3️⃣《JavaWeb系列教程》
- 🌻SSM框架系列🌻👉4️⃣《SSM框架系列教程》
🎉本博客知识点收录于🎉👉🚀《JavaSE系列教程》🚀—>✈️18【枚举、类加载器、动态代理】✈️
文章目录
- 一、枚举(Enum)
- 1.1 枚举概述
- 1.2 定义枚举类型
- 1.2.1 静态常量案例
- 1.2.2 枚举案例
- 1.2.3 枚举与switch
- 1.3 枚举的用法
- 1.3.1 枚举类的成员
- 1.3.2 枚举类的构造方法
- 1)枚举的无参构造方法
- 2)枚举的有参构造方法
- 1.3.3 枚举中的抽象方法
- 1.4 Enum 类
- 1.4.1 Enum类中的方法
- 1.4.2 测试方法功能
- 1.4.3 枚举的两个抽象方法
一、枚举(Enum)
1.1 枚举概述
枚举(enum),全称enumeration
,是JDK 1.5 中引入的新特性。Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。
在JDK1.5 之前,我们定义常量都是: public static fianl
。有了枚举之后,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。
1.2 定义枚举类型
1.2.1 静态常量案例
我们使用静态常量来设置一个季节类:
package com.dfbz.demo01_静态成员变量;/*** @author lscl* @version 1.0* @intro:*/
public class Season {public static final Integer SPRING = 1;public static final Integer SUMMER = 2;public static final Integer AUTUMN = 3;public static final Integer WINTER = 4;
}
1/2/3/4分别代表不同的含义
测试类:
package com.dfbz.demo01_静态成员变量;import org.junit.Test;/*** @author lscl* @version 1.0* @intro:*/
public class Demo01_静态成员变量 {@Testpublic void test1() {method(Season.SPRING);method(Season.WINTER);}public void method(Integer season) {switch (season) {case 1:System.out.println("Spring!"); // 具体的逻辑break;case 2:System.out.println("Summer!"); // 具体的逻辑break;case 3:System.out.println("Autumn!"); // 具体的逻辑break;case 4:System.out.println("Winter!"); // 具体的逻辑break;}}
}
1.2.2 枚举案例
Java 枚举类使用enum
关键字来定义,各个常量使用逗号来分割。
package com.dfbz.demo02;/*** @author lscl* @version 1.0* @intro:*/
public enum Season {SPRING,SUMMER,AUTUMN,WINTER
}
Tips:定义枚举类的关键字是enum,而不是Enum,在Java中所有关键字都是小写的!
其中SPRING
、SUMMER
、AUTUMN
、WINTER
都是枚举项,它们都是本类的实例,本类一共就只有四个实例对象。并且只能通过这四个关键字获取Season类的实例对象,不能使用new来创建枚举类的对象
package com.dfbz.demo02_枚举的使用;import org.junit.Test;/*** @author lscl* @version 1.0* @intro:*/
public class Demo01_枚举的使用 {@Testpublic void test1() {// 通过枚举项来获取枚举实例Season spring = Season.SPRING;Season spring2 = Season.SPRING;// 通过相同的枚举项获取的枚举实例是一样的System.out.println(spring == spring2); // true// 不同的枚举项获取的枚举实例是不一样的Season autumn = Season.AUTUMN;System.out.println(spring == autumn); // false}
}
1.2.3 枚举与switch
使用枚举,能让我们的代码可读性更强。
package com.dfbz.demo02_枚举的使用;import org.junit.Test;/*** @author lscl* @version 1.0* @intro:*/
public class Demo02_枚举与switch {@Testpublic void test1() {Season season = Season.AUTUMN;switch (season){case SPRING:System.out.println("春天~");break;case SUMMER:System.out.println("夏天!");break;case AUTUMN:System.out.println("秋天@");break;case WINTER:System.out.println("冬天&");break;default:System.out.println("错误的季节");}}
}
1.3 枚举的用法
1.3.1 枚举类的成员
枚举类和正常的类一样,可以有实例变量,实例方法,静态方法等等
- 定义枚举类:
package com.dfbz.demo02_枚举的使用;/*** @author lscl* @version 1.0* @intro:*/
public enum Color {// 在枚举常量后面还有其他成员时,分号是必须的。枚举常量必须在枚举类中所有成员的上方声明RED, GREEN, BLUE;public String aaa = "AAA"; // 普通成员变量public static String bbb = "BBB"; // 静态成员变量private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public static void method() {System.out.println("enum hello~");}
}
Tips:当枚举项后面有其他成员(构造方法、成员变量、成员方法)时,最后一个枚举项必须加分号;
- 测试类:
package com.dfbz.demo02_枚举的使用;/*** @author lscl* @version 1.0* @intro:*/
public class Demo03_枚举类的成员 {public static void main(String[] args) {// 访问静态成员变量System.out.println(Color.bbb);// 访问静态成员方法Color.method();// 通过枚举项获取实例Color red = Color.RED;// 通过枚举实例调用成员方法red.setName("红色");// 通过枚举实例调用成员方法System.out.println(red.getName()); // 红色}
}
1.3.2 枚举类的构造方法
1)枚举的无参构造方法
枚举类也可以有构造方法,构造方法默认都是private修饰,而且只能是private。因为枚举类的实例不能让外界来创建!
默认情况下,所有的枚举项的创建都是调用枚举类的无参构造方法,并且在获取任何一个枚举实例时,其他实例都将会被创建
package com.dfbz.demo03;/*** @author lscl* @version 1.0* @intro:*/
public enum Direction {// 在枚举常量后面还有其他成员时,分号是必须的。枚举常量必须在枚举类中所有成员的上方声明FRONT,BEHIND,LEFT,RIGHT;// 枚举类的构造方法都是private修饰的,可写可不写Direction(){System.out.println("Direction创建了...");}
}
Tips:
- 1:当枚举项后面有其他成员(构造方法、成员变量、成员方法)时,最后一个枚举项必须加分号;
- 2:所有的枚举类的构造方法都是私有的(private关键字可加可不加)
测试类:
package com.dfbz.demo02_枚举的使用;import org.junit.Test;/*** @author lscl* @version 1.0* @intro:*/
public class Demo04_枚举类的构造方法 {/*** 枚举的无参构造方法*/@Testpublic void test1() {// 运行代码将会创建四个枚举实例Direction behind = Direction.BEHIND;}}
运行结果:
Tips:一旦创建了枚举实例,便会初始化里面的所有枚举项;创建枚举项就等同于调用本类的无参构造器,所以FRONT、BEHIND、LEFT、RIGHT四个枚举项等同于调用了四次无参构造器
2)枚举的有参构造方法
枚举项就是枚举类的实例,在创建定义枚举项时其实就是创建枚举类的实例,因此在定义枚举项就要传递实际的参数
- 定义枚举项:
package com.dfbz.demo02_枚举的使用;/*** @author lscl* @version 1.0* @intro:*/
public enum Week {// 枚举项就是枚举类的实例,在创建定义枚举项时其实就是创建枚举的实例,因此在定义枚举项就要传递实际的参数MONDAY("星期一",1),TUESDAY("星期二"),WEDNESDAY,THURSDAY("星期四",3),FRIDAY("星期五",4),SATURDAY("星期六",5),SUNDAY("星期六",4);private String name;private Integer loveLevel;// 注意: 枚举类的构造方法只能是私有(默认情况下也是私有)Week() { // 空参构造}Week(String name) { // 有参构造this.name = name;}Week(String name, Integer loveLevel) { // 有参构造this.name = name;this.loveLevel=loveLevel;}public void show() {System.out.println("我是【" + name + "】,我的喜好程度是【" + loveLevel + "】颗星");}@Overridepublic String toString() {return "Week{" +"name='" + name + '\'' +", loveLevel=" + loveLevel +'}';}
}
- 测试类:
/*** 枚举的有参构造方法*/
@Test
public void test2() {// 获取第一个枚举实例时,将会创建所有的枚举实例Week friday = Week.FRIDAY;friday.show();System.out.println(friday);System.out.println("---------------");Week saturday = Week.SATURDAY;saturday.show();System.out.println(saturday);System.out.println("---------------");Week tuesday = Week.TUESDAY;tuesday.show();System.out.println(tuesday);System.out.println("---------------");Week wednesday = Week.WEDNESDAY;wednesday.show();System.out.println(wednesday);System.out.println("---------------");
}
- 运行效果如下:
1.3.3 枚举中的抽象方法
枚举类中可以包含抽象方法,但是在定义枚举项时必须重写该枚举类中的所有抽象方法;
我们前面说过,每一个枚举项其实都是枚举类的实例对象,因此如果当前枚举类包含抽象方法时,在定义枚举项时就需要重写此枚举类的所有抽象方法,这跟我们以前使用的匿名内部类很相似;
- 首先定义一个抽象类(包含了抽象方法):
package com.dfbz.demo03_枚举的抽象方法;/*** @author lscl* @version 1.0* @intro:*/
public abstract class AbstractSeason {public abstract void fun();
}
- 实例化这个抽象类的时候,我们必须抽象其所有的抽象方法:
package com.dfbz.demo03_枚举的抽象方法;import org.junit.Test;/*** @author lscl* @version 1.0* @intro:*/
public class Demo01_枚举的抽象方法 {@Testpublic void test1() {// 可以把abstractSeason看做是一个枚举项,在定义枚举项时必须重写枚举类的所有抽象方法AbstractSeason abstractSeason = new AbstractSeason() {@Overridepublic void fun() {System.out.println("重写了这个抽象类的所有抽象方法");}};}
}
当枚举类中含有抽象方法的时候,定义枚举项时,必须重写该枚举类中所有的抽象方法,像下面这种就是一种错误的定义:
package com.dfbz.demo03_枚举的抽象方法;/*** @author lscl* @version 1.0* @intro:*/
public enum Season {SPRING; // 编译报错,定义枚举项时必须重写枚举类包含的所有抽象方法public abstract void fun();
}
- 正确写法:
package com.dfbz.demo03_枚举的抽象方法;/*** @author lscl* @version 1.0* @intro:*/
public enum Season {SPRING(){@Overridepublic void fun() {System.out.println("我是春天~");}}; public abstract void fun();
}
- 定义多几个枚举项:
package com.dfbz.demo03_枚举的抽象方法;/*** @author lscl* @version 1.0* @intro:*/
public enum Season {SPRING(){@Overridepublic void fun() {System.out.println("我是春天...");}}, SUMMER(){@Overridepublic void fun() {System.out.println("我是夏天~");}}; public abstract void fun();
}
- 测试类:
@Test
public void test2() {Season spring = Season.SPRING;Season summer = Season.SUMMER;spring.fun();summer.fun();
}
1.4 Enum 类
1.4.1 Enum类中的方法
Java中,所有的枚举类都默认继承与java.lang.Enum
类,这说明Enum中的方法所有枚举类都拥有。另外Enum也继承与Object,因此所有的枚举类都拥有与Object类一样的方法;
Enum类中的方法如下:
Tips:枚举类除了不能拥有Object中的clone、finalize方法外,其他方法都能拥有;
Enum类新增(或重写Object)的方法:
int compareTo(E e)
:比较两个枚举常量谁大谁小,其实比较的就是枚举常量在枚举类中声明的顺序(ordinal值)boolean equals(Object o)
:比较两个枚举常量是否相等;Class<E> getDeclaringClass()
:返回此枚举类的Class对象,这与Object中的getClass()类似;int hashCode()
:返回枚举常量的hashCode
;String name()
:返回枚举常量的名字;int ordinal()
:返回枚举常量在枚举类中声明的序号,第一个枚举常量序号为0;String toString()
:把枚举常量转换成字符串;static T valueOf(Class enumType, String name)
:把字符串转换成枚举常量。
1.4.2 测试方法功能
- 定义一个枚举类:
package com.dfbz.demo07;/*** @author lscl* @version 1.0* @intro:*/
public enum Season {SPRING,SUMMER,AUTUMN,WINTER;
}
- 测试类:
package com.dfbz.demo04_Enum;import org.junit.Test;/*** @author lscl* @version 1.0* @intro:*/
public class Demo01_Enum类的方法使用 {Season spring = Season.SPRING; // ordinal:0Season summer = Season.SUMMER; // ordinal:1Season autumn = Season.AUTUMN; // ordinal:2Season winter = Season.WINTER; // ordinal:3@Testpublic void test1() {System.out.println(spring.compareTo(spring)); // 0-0=0System.out.println(spring.compareTo(summer)); // 0-1=-1System.out.println(winter.compareTo(summer)); // 3-1=2System.out.println(winter.compareTo(spring)); // 3-0=3}@Testpublic void test2() {Season spring2 = Season.SPRING;System.out.println(spring == spring2); // trueSystem.out.println(spring.equals(spring2)); // 枚举对象的equals方法比较的是内存地址值(返回true)}@Testpublic void test3() {Class<Season> clazz = spring.getDeclaringClass();Class<? extends Season> clazz2 = spring.getClass();System.out.println(clazz == clazz2); // true}@Testpublic void test4() {int hashCode = spring.hashCode();System.out.println(hashCode); // 2027961269String name = spring.name();System.out.println(name); // SPRINGint ordinal_spring = spring.ordinal();int ordinal_summer = summer.ordinal();int ordinal_autumn = autumn.ordinal();int ordinal_winter = winter.ordinal();System.out.println(ordinal_spring); // 0System.out.println(ordinal_summer); // 1System.out.println(ordinal_autumn); // 2System.out.println(ordinal_winter); // 3}@Testpublic void test5() {Season s = Season.valueOf("SPRING"); // 通过枚举项的名称获取枚举项System.out.println(s == spring); // true(返回的还是同一个枚举项)}
}
1.4.3 枚举的两个抽象方法
每个枚举类都有两个静态方法,而且这两个方法不是父类中的方法。这又是枚举类特殊的地方;
-
static T[] values()
:返回本类所有枚举项; -
static T valueOf(String name)
:通过枚举项的名字返回枚举项;
- 测试类:
@Test
public void test6() {// 获取这个枚举类中所有的枚举项Season[] values = Season.values();for (Season value : values) {System.out.println(value);}// 通过枚举项的名称获取枚举项Season s = Season.valueOf("SPRING");System.out.println(s == spring); // true
}
相关文章:

你不会工作1年了连枚举都还不知道吧?
💗推荐阅读文章💗 🌸JavaSE系列🌸👉1️⃣《JavaSE系列教程》🌺MySQL系列🌺👉2️⃣《MySQL系列教程》🍀JavaWeb系列🍀👉3️⃣《JavaWeb系列教程》…...

ks通过恶意低绩效来变相裁员(五)绩效申诉就是「小六自证吃了一碗凉粉」
目录 一、小六吃了一碗凉粉 二、给你差绩效 公司告诉你可以绩效申诉 1、公司的实际目的是啥 2、你一旦自证,就掉入了陷阱 三、谁主张谁举证——让公司证明它绩效考核的客观性和公平性 四、针对公司的流氓恶意绩效行为,还有其他招吗 五、当公司用各…...

一阶低通滤波介绍及simulink模型
一阶低通滤波 背景介绍 低通滤波是一种过滤方式,规定低频信号能正常通过,而超过设定临界值的高频信号则被阻隔、减弱。低通滤波可以简单的认为:设定一个频率点,当信号频率高于这个频率时不能通过,在数字信号中&#…...

三十三、MongoDB PHP 扩展
PHP 语言访问 MongoDB 数据库需要使用 mongo 扩展 mongo 扩展不是 PHP 官方内置的扩展,需要开发者自己手动安装和配置 本章我们将学习如何在 Linux、Window、Mac 平台上安装 mongo 扩展 Linux 上安装 PHP MongoDB 扩展 通过 pecl 来安装 在 Linux 系统上可以通…...

2D图像处理:九点标定_上(机械手轴线与法兰轴线重合)(附源码)
文章目录 1. 九点标定2. 九点标定流程2.1 机械手轴线与法兰轴线重合代码实现1. 九点标定 在2D视觉抓取项目中,如果想要让机械手准确的抓取到工件,前提是需要知道机械手应该移动到哪里(位姿)。而移动到哪里(位姿)的获取就需要对相机和机械手进行标定。因此,九点标定(2D视…...

2023最新C++面经(一):vector内存预分配,左值引用和右值引用,move语义
文章目录零、前言一、在C中,往vector插入1000个数字,怎么做能保证性能最高二、在vector中对10000个数字删除偶数位置的数,怎么做保证性能较高三、malloc用delete会出现什么问题四、weak_ptr解决的是什么问题,lock返回的对象可以直接使用吗五、…...

【C语言经典例题】调整数组使奇数全部都位于偶数前面
目录 一、题目要求 二、解题思路 分步解析 从前往后找 从后往前找 交换 三、完整代码演示 一、题目要求 输入一个整数数组,实现一个函数, 来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分, 所有偶数位于数组的后半…...

C++经典20题型,满满知识,看这一篇就够了(含答案)
今天找了20道c的经典题型,看这一篇就够了,全是干货 目录 1、题目:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总…...

卷积神经网络CNN之ZF Net网络模型详解(理论篇)
1.背景 2. ZF Net模型结构 3. 改进优缺点 一、背景 ZF Net是用作者的名字命名的,Matthew D.Zeiler 和 Rob Fergus (纽约大学),2013年撰写的论文; 论文原网址https://arxiv.org/abs/1311.2901 论文名:Vis…...

Vue 3.0 响应性 基础 【Vue3 从零开始】
#声明响应式状态 要为 JavaScript 对象创建响应式状态,可以使用 reactive 方法: import { reactive } from vue// 响应式状态const state reactive({count: 0}) reactive 相当于 Vue 2.x 中的 Vue.observable() API ,为避免与 RxJS 中的 ob…...

flex布局方式让最后一个(或第二个...n)元素居右显示
<div class"round"> <div class"income">收入</div> <div class"center"> <img style"width: 12px" src"../../img/big/up.png"> </div> <div class"rg"> <span cl…...

【Python语言基础】——Python MySQL Order By
Python语言基础——Python MySQL Order By 文章目录 Python语言基础——Python MySQL Order By一、Python MySQL Order By一、Python MySQL Order By 结果排序 请使用 ORDER BY 语句按升序或降序对结果进行排序。 ORDER BY 关键字默认按升序对结果进行排序。若要按降序对结果进…...

自然数学的哲学原理--复数理论的扩展
自然数学的哲学原理--复数理论的扩展 2023-03-05 10:27:12 自然数学的哲学原理--复数理论的扩展 一维:线,实数 二维:平面 三维:立体 四维:相对论时空 复数,以一个数对形式表示,实现了复平面的…...

tsconfig.json中的一些配置
compilerOptions 编译选项是配置文件中非常重要也比较复杂的配置选项 target:设置ts代码编译的目标版本 可选值: ES3(默认)、ES5、ES6/ES2015、ES7/ES2016、ES2017、ES2018、ES2019、ES2020、 ESNext 示例: &quo…...

Spark调优总结
下面是基于官方优化建议,加上自己的一些理解整理。官方地址:https://spark.apache.org/docs/2.4.8/tuning.html 任务并行度 Spark会根据每个文件的大小自动设置运行“map”任务的数量,而对于分布式的“reduce”操作,例如groupBy…...

4.创建和加入通道相关(network.sh脚本createChannel函数分析)[fabric2.2]
fabric的test-network例子有一个orderer组织、两个peer组织、每个组织一个节点,只有系统通道(system-channel),没有其他应用通道。我们可以使用./network.sh createChannel命令来创建一个名为mychannel的应用通道。 一、主要概念 …...

若依学习(前后端分离版)——自定义注解@Log(如何自定义注解,实现aop)
如何自定义注解 aop的基本知识与应用 若依对用户的一些更新删除等敏感操作操作进行了日志记录 注解定义和切面处理的项目位置 第一步:自定义注解log 定义了注解的相关信息。这里定义的属性可以在使用时加以定义 注解Target和Retention的作用 第二步切面逻辑…...

防止暴力破解ssh的四种方法
一. 方法介绍 防止暴力破解的四种方法: 1 密码要写的足够的复杂,通常建议将密码写16位,并且无连贯的数字或者字母;当然也可以固定一个时间修改一次密码,推荐是一个月修改一次会稳妥一些2 修改ssh的端口号,…...

jsp试卷分析管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
一、源码特点 JSP试卷分析管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&…...

可选链运算符(?.)与空值合并运算符(??)
1. 可选链运算符Optional chaining(?.) MDN定义 可选链运算符(?.)允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。?. 运算符的功能类似于 . 链式运算符,不同之处在于,在引用为空 (n…...

JavaScript 闭包
JavaScript 变量可以是局部变量或全局变量。私有变量可以用到闭包。全局变量函数可以访问函数内部定义的变量,如:实例function myFunction() {var a 4;return a * a;}尝试一下 函数也可以访问函数外部定义的变量,如:实例var a 4…...

每日记录自己的Android项目(二)—Viewbinding,WebView,Navigation
今日想法今天是想把做一个跳转页面的时候调到H5页面去,但是这个页面我用app来承载,不要调到浏览器去。所以用到了下方三个东西。Viewbindingbuild.gradle配置首先在app模块的build.gradle里添加一下代码默认情况下,每一个布局xml文件都会生成…...

20230305英语学习
Climate Change Is Suffocating Large Parts of the Ocean 研究:气候变化正在使海洋“缺氧” One day more than a decade ago, Eric Prince was studying the tracks of tagged fish when he noticed something odd.Blue marlin off the southeastern United State…...

【Linux】手把手教你在CentOS上使用docker 安装MySQL8.0
文章目录前言一. docker的安装1.1 从阿里下载repo镜像1.2 安装docker1.3 启动docker并查看版本二. 使用docker安装MySQL8.02.1 拉取MySQL镜像2.2 创建容器2.3 操作MySQL容器2.4 远程登录测试总结前言 大家好,又见面了,我是沐风晓月,本文主要…...

论文解读:High Dynamic Range and Super-Resolution from Raw Image Bursts
论文解读:High Dynamic Range and Super-Resolution from Raw Image Bursts 今天介绍一篇发表于 2022 年 ACM Tranaction on Graphic 上的文章,这篇文章通过多帧曝光将 HDR 与 SR 放在一起解决,与一般的文章不同的地方在于,这篇文…...

国内的PMP考试通过率高达97%?
自认为是虚高,虽然国人在考试方面的确独树一帜的强,应该也没有这样夸张。 如果自学,大概是50%,如果有老师教,那大概是60%到80%,还是比较高的。 为什么自学那么低?除了自身的自制力的问题&…...

IOC(概念和原理)
文章目录1. IOC容器概念2. IOC底层原理3. IOC(接口)4. IOC操作Bean管理(概念)5. IOC操作Bean管理(基于xml方式)5.1 基于xml创建对象5.2 基于xml方式注入属性5.2.1 DI:依赖注入,就是注…...

操作系统 - 第二章
一、进程的定义、组成、组织、特征 一、进程的定义 从不同的角度,进程有不同的定义 1、进程是程序的一次执行过程; 2、进程是一个程序及其数据在处理机上顺序执行时所发生的活动; 3、进程是具有独立功能的程序在数据集合上运行的过程…...

进程控制~
进程控制 (创建、终止,等待,程序替换) 进程创建: pid_t fork();父子进程,数据独有,代码共享,各有各的地址 pit_t vfork();父进程阻塞,直到子进程exit退出或者程序替换之…...

HCIP第一个实验
实验要求与实验拓扑子网划分分析将骨干链路看成一个整体,路由器后的2个环回地址先看成一个,最后再进行拆分。计算得出,一共需要划分为6个子网段,取三位。再将每一条网段,按照题目要求进行划分最后完成子网划分。子网划…...