一. 什么是枚举

枚举是一种数据类型,具有集合的一些特点,可以存放多个元素,但存储对象有限且固定,枚举也有比较常见的使用场景,如我们需要表达性别(男、女),颜色(红、黄、蓝),星期(星期一、星期二...星期日),四季(春、夏、秋、冬),地理位置(东、西、南、北),方向(前、后、左、右)等,这些场景都非常适合枚举。

二. 定义枚举

java中使用enum来定义枚举,和class,interface具有同样的等级,(注意是enum,而不是Enum),定义枚举可以有两种情况

第一种:默认构造器(空构造器)

public enum Quarter {

SPRING, SUMMER, AUTUMN, WINTER;

}

未定义成员变量和成员方法,省略了private Quarter() {}

public enum Quarter {

SPRING, SUMMER, AUTUMN, WINTER;

private Quarter(){}

}

简单说明一下:枚举enum的构造器只能是private

第二种:定义了成员变量、带参构造器

枚举可以定义成员变量,包括成员属性、方法,抽象方法,静态方法等

public enum Quarter {

SPRING("春"), SUMMER("夏"), AUTUMN("秋"), WINTER("冬");

private Quarter(String name){

this.name = name;

}

private String name;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

//静态方法

public static void printName(){

System.out.println(Quarter.SUMMER);

}

//抽象方法

public abstract void printValue();

}

注意:枚举和类一样,可以有多个构造器,即有了一个带参构造器,还可以有无参构造器,编译是可以通过的。

除此之外:

枚举enum 默认继承了java.lang.Enum类,实现了 java.lang.Seriablizable 和 java.lang.Comparable 两个接口,可序列化以及进行比较;

所有的枚举值都是常量,默认采用了public static final 进行了修饰,enum不是类,自然也不能被继承或实现;

枚举值必须在第一行,否则编译出错;

三. 枚举常见用法

1. 获取枚举元素以及成员变量

public static void main(String[] args) {

//获取枚举元素

System.out.println(Quarter.SPRING);

//调用toString()方法将枚举元素转化为String类型

System.out.println(Quarter.SPRING.name());

System.out.println(Quarter.SPRING.toString());

//获取成员变量

System.out.println(Quarter.SPRING.getName());

}

输出结果:

SPRING

SPRING

SPRING

2. 枚举遍历

有时候我们需要将枚举元素都取出来作为查询条件,此时就需要进行遍历,通过调用Quarter.values()方法

public static void main(String[] args) {

//通过values()方法得到Quarter元素的数组

Quarter[] quarters = Quarter.values();

List quarterParam = new ArrayList<>(quarters.length);

//将数组中的元素存储到List集合quarterParam中

for (Quarter quarter : quarters) {

quarterParam.add(quarter.toString());

}

}

3. switch条件判断

枚举的元素有限且固定,通过switch做条件判断却是正好

public static void main(String[] args){

Quarter quarter = Quarter.AUTUMN;

switch (quarter) {

case SPRING:

System.out.println("找到了,是它:" + SPRING);

break;

case SUMMER:

System.out.println("找到了,是它:" + SUMMER);

break;

case AUTUMN:

System.out.println("找到了,是它:" + AUTUMN);

break;

case WINTER:

System.out.println("找到了,是它:" + WINTER);

break;

default:

System.out.println("未找到");

break;

}

}

执行后结果:

找到了,是它:AUTUMN

简单说明一下:其实此处不需要default的内容,或者说将WINTER作为default即可,因为枚举天然有类型限制,你只能传递它已有的元素以及null,不过正常情况下都会提前判断传递的参数是否为null,当switch接收到null时会报java.lang.NullPointerException。

4. 枚举比较

4.1. 判断是否相等

枚举判断两个元素是否相等直接使用==进行判断即可,因为它非类,也无法实例化,存储位置自然也不会根据对象的不同而不同。

public static void main(String[] args){

System.out.println(Quarter.AUTUMN == Quarter.AUTUMN);

System.out.println(Quarter.AUTUMN == Quarter.WINTER);

}

执行结果:

true

false

也可以通过equals()方法进行比较,不过没必要,因为其底层也是通过 == 来实现的。

public abstract class Enum>

implements Comparable, Serializable {

//equals比较

public final boolean equals(Object other) {

return this==other;

}

}

4.2. 顺序比较

通过compareTo进行枚举元素比较,此处比较的是在枚举中元素的先后顺序,返回的是位置序数的差值

public static void main(String[] args){

System.out.println(Quarter.AUTUMN.compareTo(Quarter.SPRING));

System.out.println(Quarter.AUTUMN.compareTo(Quarter.WINTER));

}

执行结果为:

2

-1

我们看一下compareTo方法

public abstract class Enum>

implements Comparable, Serializable {

//元素在枚举中的序号

private final int ordinal;

//可以看到compareTo方法返回的就是两个元素ordinal的差值

public final int compareTo(E o) {

Enum> other = (Enum>)o;

Enum self = this;

if (self.getClass() != other.getClass() &&

self.getDeclaringClass() != other.getDeclaringClass())

throw new ClassCastException();

return self.ordinal - other.ordinal;

}

}

5. 枚举也可也实现接口

public interface WeatherInterface {

//获取温度

public String getTemperature(Quarter quarter);

}

public enum Quarter implements WeatherInterface{

SPRING("春"), SUMMER("夏"), AUTUMN("秋"), WINTER("冬");

private Quarter(String name){

this.name = name;

}

private String name;

public String getName() {

return name;

}

//重写获取温度方法

@Override

public String getTemperature(Quarter quarter) {

switch (quarter) {

case SPRING:

return "适中";

case SUMMER:

return "热";

case AUTUMN:

return "凉爽";

case WINTER:

return "寒冷";

default:

return "无法确定";

}

}

}

但注意枚举不可继承其他类

public class Pquarter {}

//无法编译通过

public enum Quarter extends Pquarter {}

6. 使用接口来组织枚举

如果枚举太多也不好管理,同时条理不够清晰,我们可以通过接口来将多个相关枚举组织在一起进行管理,

public interface Weather {

enum Quarter implements Weather {

SPRING, SUMMER, AUTUMN, WINTER;

}

enum Temperature implements Weather {

MODERATE, HEAT, COOL, COLD

}

//调用时直接通过Weather.Quarter.SPRING即可。

}

四. 总结

本文主要介绍了枚举enum主要特点,定义,无参构造器,有参构造器,枚举的常用方法举例以及主要的应用场景,若有不对之处,请批评指正,望共同进步,谢谢!

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

java enum 序号_Java的枚举enum示例详解相关推荐

  1. java策略模式_Java设计模式之策略模式详解

    本文实例为大家分享了Java策略模式,供大家参考,具体内容如下 1.策略模式(Strategy Pattern)是一种比较简单的模式,也叫做政策模式(PolicyPattern). 定义如下: Def ...

  2. java lombok 视频_Java开发神器Lombok使用详解

    最近正在写SpringBoot系列文章和录制视频教程,每次都要重复写一些Getter/Setter.构造器方法.字符串输出的ToString方法和Equals/HashCode方法等.甚是浪费时间,也 ...

  3. java linkedlist实例_Java Linkedlist原理及实例详解

    这篇文章主要介绍了Java Linkedlist原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 定义:linkedlist属于链表结构 ...

  4. java多线程教程_java 基础教程之多线程详解及简单实例

    java 多线程详解 在这篇文章里,我们关注多线程.多线程是一个复杂的话题,包含了很多内容,这篇文章主要关注线程的基本属性.如何创建线程.线程的状态切换以及线程通信. 线程是操作系统运行的基本单位,它 ...

  5. java js倒计时_Java实现倒计时的方法详解

    这篇文章主要介绍了Java编程倒计时实现的三个示例,三种实现方法,具有一定参考价值,需要的朋友可以了解下. 实现Java编程中倒计时的方法有许多,下面我们通过三个示例来简单了解下它的实现过程. 1.简 ...

  6. java搜索代码_Java实现搜索功能代码详解

    首先,我们要清楚搜索框中根据关键字进行条件搜索发送的是get请求,并且是向当前页面发送get请求 //示例代码 请求路径为当前页面路径 "/product" 当我们要实现多条件搜索 ...

  7. java闭合数据_java多线程中线程封闭详解

    线程封闭的概念 访问共享变量时,通常要使用同步,所以避免使用同步的方法就是减少共享数据的使用,这种技术就是线程封闭. 实现线程封闭的方法 1:ad-hoc线程封闭 这是完全靠实现者控制的线程封闭,他的 ...

  8. java 类参数_Java的数据类型和参数传递(详解)

    Java提供的数据类型主要分为两大类:基本数据类型和引用数据类型. Java中的基本数据类型 名称 大小 取值范围 byte型 (字节) 8bit -128-127 (-2^7到2^7-1) shor ...

  9. java静态多态_Java静态方法不具有多态性详解

    动态绑定机制使得基类的引用能够指向正确的子类对象,从而使得面向基类编程成为可能. 然而动态绑定在以下两种情况会失效. 1.基类方法是private或final修饰的 这个很好理解,因为private说 ...

最新文章

  1. apache用户认证
  2. ngx_lua应用最佳实践
  3. 0.0 目录-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  4. boost :: swap交换整数数组的测试程序
  5. 什么叫预判_什么才是真正的用户画像?
  6. vue each_Vue 应用单元测试的策略与实践 05 - 测试奖杯策略
  7. python下电影_Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法...
  8. 三、数据预处理——处理分类型数据:编码与哑变量
  9. Linux下安装Octave
  10. 40-10-010-运维-kafka-2.11-基本操作
  11. 温故而知新_C语言_define_宏
  12. 系列1—BabeLua入门
  13. 小米手机解BL锁、线刷详细教程,适用于小米全系列手机
  14. Linux入门,RTFM阅读那该死的手册
  15. 怎么把图片弄成logo_怎么把logo变成矢量图
  16. 超火的数码产品犀牛rhino模型素材网站合集看过来
  17. 为啥中国移动免费宽带突然不香了, 背后的猫腻,你知道吗?
  18. 自动化学报Ctex+texstudio配置方法
  19. 《大道至简》第二章读后感--是懒人造就了方法
  20. 引文信件和地址的写法!

热门文章

  1. 郑东新区龙岗小学师生赴中医药文化体验馆体验学习
  2. 大神f1修改服务器的密码,大神F1 Plus锁屏密码怎么设置 大神F1 Plus锁屏密码设置教程...
  3. Linux 下Coredump分析与配置
  4. timestamps 字段按天去group by的写法
  5. 关于ffmpeg with h264编码器安装的步骤
  6. 数据结构笔记(2)——二叉树基本算法大全
  7. ps4pro折腾服务器网站,【教学】简易 PS4 Pro 更换 SSD!玩 MHW 不用等 (安装+数据转移) - 宅客ZhaiiKer...
  8. VIEWGOOD(远古)大科普:直播观看自由掌控的直播时移技术介绍
  9. 少儿学python书籍推荐_儿童节,我们从零开始——Python入门资源推荐
  10. MP3播放器如果你在移动