Java 枚举一口气讲完!(´▽`ʃ♡ƪ)

news2024/10/6 13:17:38

Java 枚举类型

Java面向对象设计 - Java枚举类型

什么是枚举类型?

枚举类型创建常量的有序列表作为类型。它以特定顺序指定常量。

在枚举类型中定义的常量是该枚举类型的实例。

语法

使用关键字enum使用以下语法定义枚举类型:

<access-modifier> enum <enum-type-name>  {
    // List of  comma  separated names of  enum constants
}

<access-modifiers>与类的访问修饰符相同:public,private,protected或package-level。

<enum-type-name>是有效的Java标识符。

枚举类型的主体放在大括号中,名称后面。主体可以有逗号分隔的常量和其他元素的列表,例如实例变量,方法等。

大多数时候,枚举体只包括常量。

例子

下面的代码声明了一个名为Gender的枚举类型,它声明了两个常量:MALE和FEMALE:

public enum Gender  {
    MALE,  FEMALE;  // The semi-colon is optional
}

将枚举常量命名为大写是一种惯例。

以下代码声明了一个名为Level的公共枚举类型,它具有四个枚举常量:LOW,MEDIUM,HIGH和URGENT。

public enum Level {
    LOW,  MEDIUM,  HIGH, URGENT;
}

可以从应用程序中的任何位置访问公共枚举类型。

公共枚举类型保留在具有枚举类型名称的文件中。级别枚举将保存在名为Level.java的文件中。

我们需要在包中放置枚举类型,我们可以使用 import 语句导入枚举类型。

枚举变量

我们可以声明枚举类型的变量,就像声明类类型的变量一样。

以下代码声明Level枚举类型的errorLevel变量。

Level errorLevel;

您可以为枚举类型变量分配null,如下所示:

Level defectLevel = null;

在switch语句中使用枚举类型

您可以在switch语句中使用枚举类型。

当switch表达式是枚举类型时,所有case标签必须是同一枚举类型的不合格枚举常量。

enum Direction {
  East, South, West, North
}

public class Main {
  public static void main(String args[]) {
    Direction dir = Direction.South;
    switch (dir) {
    case South:
      System.out.println("south");
      break;
    case East:
      System.out.println("East");
      break;
    case West:
      System.out.println("West");
      break;
    case North:
      System.out.println("North.");
      break;
    }
  }
}

上面的代码生成以下结果。

嵌套枚举类型

我们可以在类,接口或另一个枚举类型中有一个嵌套的枚举类型声明。

嵌套枚举类型是隐式静态的。因为枚举类型总是静态的,所以我们不能在方法体内声明一个局部枚举类型。

对于嵌套枚举类型,我们可以使用任何访问修饰符(public,private,protected或package)级别。

以下代码显示了如何在Person类中声明名为Gender的嵌套公共枚举类型。

class Person {
  public enum Gender {
    MALE, FEMALE
  }
}

public class Main {
  public static void main(String[] args) {
    Person.Gender m = Person.Gender.MALE;
    Person.Gender f = Person.Gender.FEMALE;
    System.out.println(m);
    System.out.println(f);
  }
}

Person.Gender枚举类型可以从应用程序中的任何位置访问,因为它已被声明为public。

我们也可以通过使用静态导入导入枚举常量来使用枚举常量的简单名称。

import static  com.w3cschool.enums.Person.Gender.*;

实现枚举类型的接口

枚举类型可以实现接口。实现接口的枚举类型的规则与实现接口的类的规则相同。

下面的代码演示了如何让enum类型实现一个接口。

interface Command {
  void execute();
}

enum Level implements Command {
  LOW {
    public void execute() {
      System.out.println("Low...");
    }
  },
  HIGH {
    public void execute() {
      System.out.println("HIGH...");
    }
  };
  public abstract void execute();
}

public class Main {
  public static void main(String... args) {
    for (Command cmd : Level.values()) {
      cmd.execute();
    }
  }
}

上面的代码生成以下结果。

Java 枚举值 

Java面向对象设计 - Java枚举值

枚举类型定义了两件事:

  • 枚举常量
  • 这些常量的顺序

以下代码声明了一个名为Level的公共枚举类型,它具有四个枚举常量:LOW,MEDIUM,HIGH和URGENT。

public enum Level {
    LOW,  MEDIUM,  HIGH, URGENT;
}

Level枚举类型定义了四个枚举常量。

Level枚举类型的变量只能有四个值之一 - LOW,MEDIUM,HIGH和URGENT或null。

我们可以使用点符号通过使用枚举类型名称作为限定符来引用枚举常量。

以下代码将值分配给Level枚举类型的变量:

Level low  = Level.LOW; 
Level medium = Level.MEDIUM; 
Level high  = Level.HIGH; 
Level urgent = Level.URGENT;

我们不能实例化枚举类型。以下代码导致编译时错误:

Level badAttempt   = new Level(); // A  compile-time error

枚举分配顺序号

枚举类型为其所有常量分配一个顺序号,称为ordinal。

序数从零开始,在常数列表中从第一个到最后一个递增1。

第一个枚举常量赋值为零,第二个为1,第三个为2,依此类推。

分配给Level枚举类型中声明的常量的序数值为0到LOW,1到MEDIUM,2到HIGH,以及3到URGENT。

每个枚举常量都有一个与常量的标识符相同的名称。例如,级别枚举类型中的LOW常数的名称为“LOW”。

我们可以分别使用name()和ordinal()方法获取枚举常量的名称和序号。

每个枚举类型都有一个名为values()的静态方法,它按它们在正文中声明的顺序返回一个常量数组。

以下代码打印在Level枚举类型中声明的所有枚举常量的名称和序号。

enum Level {
  LOW, MEDIUM, HIGH, URGENT;
}

public class Main {
  public static void main(String[] args) {
    for (Level s : Level.values()) {
      String name = s.name();
      int ordinal = s.ordinal();
      System.out.println(name + "(" + ordinal + ")");
    }
  }
}

上面的代码生成以下结果。

枚举常量的反向查找

我们可以从名称或位置获得枚举常量的引用。使用valueOf()方法。

枚举常量的反向查找区分大小写。

我们可以使用values()方法返回的数组,通过顺序执行反向查找。

values()方法返回的数组中的值的顺序与枚举常量的声明顺序相同。

枚举常量的序数从零开始。

以下代码演示了如何反转查找枚举常量:

enum Level {
  LOW, MEDIUM, HIGH, URGENT;
}

public class Main {
  public static void main(String[] args) {
    Level low1 = Level.valueOf("LOW");
    // A reverse lookup using a name
    Level low2 = Level.values()[0];
    // A reverse lookup using an ordinal
    System.out.println(low1);
    System.out.println(low2);
    System.out.println(low1 == low2);

  }
}

上面的代码生成以下结果。

枚举常量的范围

java.util.EnumSet集合类与枚举类型的枚举常量列表一起使用。

下面的代码演示了如何使用EnumSet类来处理枚举常量的范围。

import java.util.EnumSet;

enum Level {
  LOW, MEDIUM, HIGH, URGENT;
}

public class Main {
  public static void main(String[] args) {
    EnumSet<Level> allLevels = EnumSet.allOf(Level.class);
    print(allLevels);

    EnumSet<Level> l = EnumSet.range(Level.LOW, Level.URGENT);
    print(l);

  }
  public static void print(EnumSet<Level> levels) {
    for (Level d : levels) {
      System.out.println(d + "  ");
    }
  }
}

上面的代码生成以下结果。

Java 枚举类 

Java面向对象设计 - Java枚举类

枚举类型的超类

编译枚举类型时,编译器会创建一个类。

枚举类型可以具有构造函数,字段和方法。枚举类型仅在编译器生成的代码中实例化。

每个枚举类型都隐式地扩展java.lang.Enum类。 Enum类中定义的所有方法都可以与所有枚举类型一起使用。

枚举类

下表列出了在Enum类中定义的方法。

  • public final String name()
    返回枚举常量的名称。
  • public final int ordinal()
    返回枚举常量的顺序。
  • public final boolean equals(Object other)
    如果指定的对象等于枚举常量,则返回true。否则,它返回false。 ==运算符和equals()方法返回相同的结果,当它们用于两个枚举常量。
  • public final int hashCode()
    返回枚举常量的哈希码值。
  • public final int compareTo(E o)
    将此枚举常量与指定的枚举常量进行比较。它返回此枚举常量和指定的枚举常量的序数值的差异。
  • public final Class getDeclaringClass()
    返回声明枚举常量的类的类对象。
  • public String toString()
    默认情况下,它返回枚举常量的名称,这与name()方法相同。
  • public static valueOf(Class enumType,String name)返回指定的枚举类型和名称的枚举常量。

例子

Level  lowLevel = Enum.valueOf(Level.class, "LOW")

以下代码显示了如何比较两个枚举常量:

enum Level {
  LOW, MEDIUM, HIGH, URGENT;
}

public class Main {
  public static void main(String[] args) {
    Level s1 = Level.LOW;
    Level s2 = Level.HIGH;

    // s1.compareTo(s2) returns s1.ordinal() - s2.ordinal()
    int diff = s1.compareTo(s2);
    if (diff > 0) {
      System.out.println(s1 + "  occurs after  " + s2);
    } else {
      System.out.println(s1 + "  occurs before " + s2);
    }

  }
}

上面的代码生成以下结果。

Java 枚举方法 

Java面向对象设计 - Java枚举方法

因为枚举类型实际上是一个类类型,所以我们可以在枚举类型体中声明一切,我们可以在类体中声明它。

以下代码使用字段,构造函数和方法定义了一个级别枚举。

public enum Level {
  LOW(30), MEDIUM(15), HIGH(7), URGENT(1);

  // Declare an instance variable
  private int levelValue;

  // Declare a private constructor
  private Level(int levelValue) {
    this.levelValue = levelValue;
  }

  public int getLevelValue() {
    return levelValue;
  }
}

上面的代码声明了一个实例变量 levelValue ,它将为每个枚举常量存储一个值。

它还定义了一个私有构造函数,它接受一个int参数。它将其参数的值存储在实例变量中。

我们可以向枚举类型添加多个构造函数。

我们不能向枚举类型添加公共或受保护的构造函数。

级别枚举声明一个公共方法getLevelValue()。

枚举常量声明已更改为

LOW(30), MEDIUM(15),  HIGH(7),  URGENT(1);

现在每个枚举常量名称后面都跟着括号中的整数值。 LOW(30)是调用int参数类型的构造函数的缩写。

当创建枚举常量时,括号中的值将被传递给我们添加的构造函数。

LOW调用默认的无参数构造函数,而LOW(30)使用参数调用构造函数。

例子

以下代码测试Level枚举类型。它打印常量的名称,它们的序数和它们的下划线值。

enum Level {
  LOW(30), MEDIUM(15), HIGH(7), URGENT(1);

  // Declare an instance variable
  private int levelValue;

  // Declare a private constructor
  private Level(int levelValue) {
    this.levelValue = levelValue;
  }

  public int getLevelValue() {
    return levelValue;
  }
}

public class Main {
  public static void main(String[] args) {
    for (Level s : Level.values()) {
      String name = s.name();
      int ordinal = s.ordinal();
      int underLine = s.getLevelValue();
      System.out.println("name=" + name + ",  ordinal=" + ordinal + ", underLine="
          + underLine);
    }
  }
}

上面的代码生成以下结果。

Java 枚举主体

Java面向对象设计 - Java枚举主体

将主体添加到枚举常量

我们可以为每个枚举常量添加一个不同的体。身体可以有字段和方法。

枚举常量的主体放在其名称后面的大括号中。

如果枚举常量接受参数,其主体将遵循其参数列表。将主体与枚举常量相关联的语法如下:

<access-modifier> enum <enum-type-name>  { 
   ENUM_VALUE1  {
      // Body for ENUM_VALUE1  goes  here
   },
   ENUM_VALUE2  {
      // Body for ENUM_VALUE2  goes  here
   },
   ENUM_VALUE3(arguments-list)  {
      // Body of  ENUM_VALUE3  goes  here
   };

   // Other  code  goes  here
}

例子

下面的代码用body创建了Level枚举类型。

enum Level {
  LOW("Low Level", 30) {
    public double getDistance() {
      return 30.0;
    }
  },
  MEDIUM("Medium Level", 15) {
    public double getDistance() {
      return 15.0;
    }
  },
  HIGH("High Level", 7) {
    public double getDistance() {
      return 7.0;
    }
  },
  URGENT("Urgent Level", 1) {
    public double getDistance() {
      return 1.0;
    }
  };

  private int levelValue;
  private String description;

  private Level(String description, int levelValue) {
    this.description = description;
    this.levelValue = levelValue;
  }

  public int getLevelValue() {
    return levelValue;
  }

  @Override
  public String toString() {
    return this.description;
  }

  public abstract double getDistance();
}

public class Main {
  public static void main(String[] args) {
    for (Level s : Level.values()) {
      String name = s.name();
      String desc = s.toString();
      int ordinal = s.ordinal();
      int levelValue = s.getLevelValue();
      double distance = s.getDistance();
      System.out.println("name=" + name + ",  description=" + desc
          + ",  ordinal=" + ordinal + ", levelValue=" + levelValue
          + ", distance=" + distance);
    }
  }
}

级别枚举有一个抽象方法getDistance()。

每个实例常量都有一个实体为getDistance()方法提供实现。

它重写了Enum类中的toString()方法。

上面的代码生成以下结果。

Java 枚举比较

Java面向对象设计 - Java枚举比较

您可以通过三种方式比较两个枚举常量:

  • 使用Enum类的compareTo()方法
  • 使用Enum类的equals()方法
  • 使用==运算符

Enum类的compareTo()方法比较同一枚举类型的两个枚举常量。它返回两个枚举常量的序数差。如果两个枚举常量相同,则返回零。

例子

以下代码将打印-3,因为LOW(ordinal = 0)和URGENT(ordinal = 3)的序数的差为-3。

负值表示正在比较的常数发生在比较对象之前。

enum Level {
  LOW, MEDIUM, HIGH, URGENT;
}

public class Main {
  public static void main(String[] args) {
    Level s1 = Level.LOW;
    Level s2 = Level.URGENT;

    // s1.compareTo(s2) returns s1.ordinal() - s2.ordinal()
    int diff = s1.compareTo(s2);
    System.out.println(diff);
  }
}

上面的代码生成以下结果。

例2

Enum类的equals()方法比较两个枚举常量的相等性。

枚举常量只等于自身。equals()方法可以在不同类型的两个枚举常量上调用。

enum Level {
  LOW, MEDIUM, HIGH, URGENT;
}

public class Main {
  public static void main(String[] args) {
    Level s1  = Level.LOW; 
    Level s2  = Level.URGENT; 
    System.out.println(s1.equals(s1)); 
  }
}

上面的代码生成以下结果。

我们可以使用等于运算符==来比较两个枚举常量的相等性。

==运算符的两个操作数必须是相同的枚举类型。

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

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

相关文章

Vue基础指令用法

vue2&#xff0c;官网&#xff1a;介绍 — Vue.js (vuejs.org) 例子&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-s…

【SpringBoot】基础+JSR303数据校验

目录 一、Spring Boot概要 1. SpringBoot介绍 2. SpringBoot优点 3. SpringBoot缺点 4. 时代背景-微服务 二、Spring Boot 核心配置 1. Spring Boot配置文件分类 1.1 application.properties 1.2 application.yml 1.3 小结 2. YAML概述 3. YAML基础语法 3.1 注意事…

生信初学者教程(二十六):特征和免疫浸润的关联分析

文章目录 介绍加载R包导入数据函数重要特征与免疫细胞的相关热图SLC6A8关联图SLC6A8与特定免疫细胞SLC6A8与其他免疫细胞输出结果总结介绍 在成功获取核心特征集之后,我们计划深入地探究这些特征与免疫浸润细胞之间的关联性,这是因为免疫浸润细胞在癌症的进程中扮演着至关重要…

成都睿明智科技有限公司抖音电商新蓝海的领航者

在当今这个数字化浪潮汹涌的时代&#xff0c;电商行业正以惊人的速度迭代升级&#xff0c;而抖音电商作为新兴势力&#xff0c;更是凭借其庞大的用户基数、精准的算法推荐和高度互动的社区氛围&#xff0c;成为了众多商家竞相追逐的蓝海市场。在这片充满机遇与挑战的海洋中&…

关于Excel将列号由字母改为数字

将Excel的列表由字母改为数字 步骤&#xff1a; 文件-选项-公式-勾选“使用公式”中的“R1C1引用样式(R)”-确定即可 部分步骤图示 设置前的样子 设置后的样子 虽然现在还不清楚在xlwings操作Excel时有什么作用&#xff0c;先留着吧。

内网靶场 | 渗透攻击红队内网域渗透靶场-1(Metasploit)零基础入门到精通,收藏这一篇就够了

“ 和昨天的文章同一套靶场&#xff0c;这次主要使用的是Kali Linux以及Metasploit来打靶场&#xff0c;熟悉一下MSF在内网渗透中的使用&#xff0c;仅供学习参考&#xff0c;大佬勿喷。本期文章靶场来自公众号&#xff1a;渗透攻击红队。” 靶场下载地址&#xff1a;https://…

SpringBoot框架在在线教育系统中的应用

3系统分析 3.1可行性分析 通过对本微服务在线教育系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本微服务在线教育系统采用SSM框架&#xff0c;JAVA作为开…

微调大语言模型——超详细步骤

微调一个语言模型&#xff0c;其实就是在一个已经训练过的模型上&#xff0c;继续用新数据进行训练&#xff0c;帮助模型更好地理解和处理这个新的任务。可以把这个过程想象成教一个已经懂很多道理的人去解决新的问题。 这个过程可以分为五个简单的步骤&#xff1a; 加载预训练…

【目标检测】桥梁表面缺陷检测数据集6710张7类缺陷VOC+YOLO格式

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;6718 标注数量(xml文件个数)&#xff1a;6718 标注数量(txt文件个数)&#xff1a;6718 标注…

车载测试分享:CANoe工具使用、真实项目实操、UDS诊断测试、ECU刷写测试、物理层测试、数据链路层测试、应用层测试、HIL测试等

FOTA模块中OTA的知识点&#xff1a;1.测试过程中发现哪几类问题&#xff1f; 可能就是一个单键的ecu&#xff0c;比如升了一个门的ecu&#xff0c;他的升了之后就关不上&#xff0c;还有就是升级组合ecu的时候&#xff0c;c屏上不显示进度条。 2.在做ota测试的过程中&#xff…

知识链=知识图谱+大模型+推理-幻觉

最近由华东师大和香港大学联合提出了一种面向大语言模型推理的幻觉缓解方法Chain-of-Knowledge被ACL2024接收为长文主会。 PDF: https://arxiv.org/pdf/2306.06427 最近这两年&#xff0c;诸如GPT-4、LLaMA3等一系列超百亿规模的大语言模型相继提出&#xff0c;这些大模型以其…

AI少女/HS2甜心选择2 仿逆水寒人物卡全合集打包

内含AI少女/甜心选择2 仿逆水寒角色卡全合集打包共6张 内含&#xff1a;白灵雪魅落霞飞雁君临华歌白君临华歌黑平野星罗晚香幽韵 下载地址&#xff1a; https://www.51888w.com/436.html 部分演示图&#xff1a;

P10185 [YDOI R1] Necklace

[YDOI R1] Necklace - 洛谷 因为是方案数求和 我们考虑计算每种珠子单独贡献的方案数有 因为有二项式定理 构造 因为n不取0&#xff0c;便有 时间复杂度 modint qmi code #include <bits/stdc.h>#define INF (1ll<<60) #define eps 1e-6 using namespace std; …

Hive数仓操作(十七)

一、Hive的存储 一、Hive 四种存储格式 在 Hive 中&#xff0c;支持四种主要的数据存储格式&#xff0c;每种格式有其特点和适用场景&#xff0c;不过一般只会使用Text 和 ORC &#xff1a; 1. Text 说明&#xff1a;Hive 的默认存储格式。存储方式&#xff1a;行存储。优点…

Leetcode—763. 划分字母区间【中等】

2024每日刷题&#xff08;175&#xff09; Leetcode—763. 划分字母区间 C实现代码 class Solution { public:vector<int> partitionLabels(string s) {int rightmost[26];int l 0;int r 0;for(int i 0; i < s.length(); i) {rightmost[s[i] - a] i;}vector<…

强化学习笔记之【DDPG算法】

强化学习笔记之【DDPG算法】 文章目录 强化学习笔记之【DDPG算法】前言&#xff1a;原论文伪代码DDPG算法DDPG 中的四个网络代码核心更新公式 前言&#xff1a; 本文为强化学习笔记第二篇&#xff0c;第一篇讲的是Q-learning和DQN 就是因为DDPG引入了Actor-Critic模型&#x…

虚拟电厂可视化:智能能源管理新时代

通过图扑可视化技术&#xff0c;全方位展示虚拟电厂的运行状态&#xff0c;优化能源生产与消耗&#xff0c;提高电网效率和稳定性&#xff0c;实现智能能源管理。

第十一篇——鸡兔同笼:方程这个数学工具为什么很强大?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 数学的伟大思想&#xff1b;不仅仅是我们解决了某一个具体问题&#xff1…

TIBCO Jaspersoft Studio 创建数据源并进行测试

1、连接数据源&#xff1a; 右键Data Adapters &#xff0c;然后新建 根自己的情况&#xff0c;进行创建&#xff0c;这里测试用的是excel表格。 2、新建Jasper Report&#xff0c;然后我们选择刚刚创建的数据源 这样report就建好了&#xff0c;然后我们进行测试。 3、先把不…

永旺梦乐城盛大开业,3300个停车位的智慧运营管理系统上线!

长沙首家&#xff01; 永旺梦乐城 9月12日正式开业&#xff01; 这座融合特色餐饮、娱乐体验的商场&#xff0c; 将为长沙消费者带来&#xff0c; 超越传统商业综合体的全新体验。 开业当日&#xff0c;占地1.3万平方米的永旺超市人声鼎沸&#xff0c;顾客络绎不绝&#x…