5分钟轻松拿下Java枚举

news2025/1/13 13:11:19

文章目录

  • 一、枚举(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_静态成员变量 {

    @Test
    public 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中所有关键字都是小写的!

其中SPRINGSUMMERAUTUMNWINTER都是枚举项它们都是本类的实例,本类一共就只有四个实例对象。并且只能通过这四个关键字获取Season类的实例对象,不能使用new来创建枚举类的对象

package com.dfbz.demo02_枚举的使用;

import org.junit.Test;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
public class Demo01_枚举的使用 {

    @Test
    public 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 {

    @Test
    public 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_枚举类的构造方法 {


    /**
     * 枚举的无参构造方法
     */
    @Test
    public 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 + "】颗星");
    }

    @Override
    public 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_枚举的抽象方法 {
    @Test
    public void test1() {
        // 可以把abstractSeason看做是一个枚举项,在定义枚举项时必须重写枚举类的所有抽象方法
        AbstractSeason abstractSeason = new AbstractSeason() {
            @Override
            public 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(){
        @Override
        public void fun() {
            System.out.println("我是春天~");
        }
    };        

    public abstract void fun();
}
  • 定义多几个枚举项:
package com.dfbz.demo03_枚举的抽象方法;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
public enum Season {

    SPRING(){
        @Override
        public void fun() {
            System.out.println("我是春天...");
        }
    },          

    SUMMER(){
        @Override
        public 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:0
    Season summer = Season.SUMMER;              // ordinal:1
    Season autumn = Season.AUTUMN;              // ordinal:2
    Season winter = Season.WINTER;              // ordinal:3

    @Test
    public void test1() {
        System.out.println(spring.compareTo(spring));           // 0-0=0
        System.out.println(spring.compareTo(summer));           // 0-1=-1
        System.out.println(winter.compareTo(summer));           // 3-1=2
        System.out.println(winter.compareTo(spring));           // 3-0=3
    }

    @Test
    public void test2() {

        Season spring2 = Season.SPRING;

        System.out.println(spring == spring2);                  // true
        System.out.println(spring.equals(spring2));             // 枚举对象的equals方法比较的是内存地址值(返回true)
    }

    @Test
    public void test3() {
        Class<Season> clazz = spring.getDeclaringClass();
        Class<? extends Season> clazz2 = spring.getClass();

        System.out.println(clazz == clazz2);            // true
    }

    @Test
    public void test4() {

        int hashCode = spring.hashCode();
        System.out.println(hashCode);           // 2027961269

        String name = spring.name();
        System.out.println(name);               // SPRING

        int ordinal_spring = spring.ordinal();
        int ordinal_summer = summer.ordinal();
        int ordinal_autumn = autumn.ordinal();
        int ordinal_winter = winter.ordinal();

        System.out.println(ordinal_spring);         // 0
        System.out.println(ordinal_summer);         // 1
        System.out.println(ordinal_autumn);         // 2
        System.out.println(ordinal_winter);         // 3
    }

    @Test
    public 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
}

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

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

相关文章

c++系列12:使用vscode进行编译

1. 入门 1.1 操作方法 1&#xff09;下载安装vscode 2&#xff09;在扩展中搜索c/c extension pack并安装&#xff08;或者直接打开cpp文件&#xff0c;会自动提示进行安装&#xff09; 3&#xff09;创建项目目录&#xff0c;会自动生成.vscode文件夹&#xff0c;里面是编译…

虹科分享 | Domo零售行业商业智能白皮书:《从零售企业的数据中获取价值》

市场因素、技术创新和不断增长的客户期望&#xff0c;给电子商务带来了新的机遇&#xff0c;与此同时也给传统零售行业带来了压力。零售业正面临着新的挑战&#xff1a;不断变化的需求模式和渠道、不断变化的服务期望、复杂的库存以及交付问题。为了解决这些问题&#xff0c;零…

Linux系统介绍及熟悉Linux基础操作

一、什么是Liunx Linux&#xff0c;全称GNU/Linux&#xff0c;是一种免费使用和自由传播的类UNIX操作系统&#xff0c;其内核由林纳斯本纳第克特托瓦兹&#xff08;Linus Benedict Torvalds&#xff09;于1991年10月5日首次发布&#xff0c;它主要受到Minix和Unix思想的启发&am…

机器学习知识总结 —— 21. 什么是主成分分析

文章目录什么是PCA&#xff08;Principal Component Analysis&#xff09;协方差矩阵什么是协方差协方差矩阵特征值与特征向量PCA降维什么是PCA&#xff08;Principal Component Analysis&#xff09; 在机器学习中&#xff0c;PCA&#xff08;Principal Component Analysis&a…

除了Confluence,还有哪些好用的文档管理软件?测评

在早期&#xff0c;文档管理软件主要是为了将企业内部海量的电子文档集中存储、管理&#xff0c;通过设置共享权限进行内部员工的文档分发&#xff0c;有些甚至可能要提供API接口&#xff0c;便于将ERP、OA等系统的文档纳入其中&#xff0c;形成企业文档管理中心。而随着时间的…

window下的快捷程序链怎么设置环境变量|cmd直接运行快捷方式

对于需要在命令行执行的程序&#xff0c;每次都需要设置环境变量很是麻烦&#xff0c;而且也会导致非必要的文件也在环境变量里并且如果多版本共存软件也会导致只能一个存在环境变量里不然会冲突&#xff0c;这时候如果可以通过快捷方式那不就完美解决了么&#xff1f; 快捷方…

一文带你入门Docker

目录一、什么是Docker&#xff1f;1、背景2、Docker三要素3、Docker四个组成部分二、Docker安装步骤1、VM虚拟机下载2、centrOS 8下载3、安装docker4、配置阿里云镜像加速器5、docker run 执行顺序6、docker和虚拟机比较三、docker常用命令四、docker镜像分层一、什么是Docker&…

运维语言、bash特性、history命令

P4 浅谈运维和编程语言 shell简述 shell C语言开发&#xff0c;和同是C开发的操作系统更兼容。因此shell效率肯定大于其他工具。 shell语言类型 其他运维语言 shell优势 P5 Bash特性 bash是什么 命令历史 -c 清楚存放的历史命令 -r 回复删除的历史命令 &#xff01;历史id…

0基础怎么入门黑客?

" 有一群人大声嚷嚷着自己是黑客&#xff0c;但他们不是。他们&#xff08;主要是正值青春的少年&#xff09;是一些蓄意破坏计算机和电话系统的人。真正的黑客把这些人叫做“骇客”(cracker)&#xff0c;并不屑与之为伍。多数真正的黑客认为骇客们又懒又不负责任&#x…

FCN学习

简介 FCN是首个端对端的针对像素级别预测的全卷积网络&#xff0c;发表在2015CVPR。全卷积的意思是全连接层全部替换成了卷积层。 FCN的评价指标 FCN的评价指标主要采用Mean IOU&#xff0c;他在当时已经超过了大多数网络的Mean IOU。 全卷积的优势 通过观察我们能够发现&am…

山东大学数字图像处理实验:MATLAB的图像显示方法

文章目录MATLAB 学习实验目的实验原理及方法实验内容MATLAB的图像显示方法实验目的实验内容MATLAB 学习 实验目的 了解 MATLAB 的基本功能及操作方法。掌握典型离散信号的 Matlab 产生和显示。 实验原理及方法 在 MATLAB 中, 序列是用矩阵向量表示, 但它没有包含采样信息, …

程序,进程,线程 并行,并发

程序&#xff1a; 程序的本质是初始的数据加一些指令&#xff0c;是数据跟指令的集合&#xff0c;是有序代码的集 合。程序的指令在代码里面相当于一个函数&#xff0c;调用一个函数相当于向程序发出一条指令&#xff0c;数据就是一些变量&#xff0c;变量就是用来保存数据的。…

ANTLR的IDE——ANTLRWorks2的安装及基本使用

1. ANTLRWorks2的简单介绍 ① ANTLR官网对ANTLRWorks2的介绍 ANTLRWorks 2.此IDE是ANTLR v3 / v4语法以及StringTemplate模板的复杂编辑器。 它可以运行ANTLR工具来生成识别器&#xff0c;并可以运行TestRig&#xff08;在命令行上运行&#xff09;来测试语法。 要将ANTLR生成…

GCC编译器 MinGW的下载安装使用教程

哎 总所周知 gcc可以用来编译C 和C。在linux广泛应用&#xff0c;那么window怎么使用gcc呢。就要用到gcc的window工具----MInGW&#xff0c;安装好之后&#xff0c;直接可以在windows的dos界面编译。下面讲解安装使用过程。1.官网下载MinGW - Minimalist GNU for Windows downl…

家庭消耗品跟踪管理软件HomeLists

什么是 HomeLists &#xff1f; HomeLists 是一款自托管耗材统计软件&#xff0c;能通过提醒等帮助您跟踪家庭消耗品。 安装 在群晖上以 Docker 方式安装。 在注册表中搜索 homelists &#xff0c;选择第一个 aceberg/homelists&#xff0c;版本选择 latest。 本文写作时&…

HNU工训中心:直流电路测量分析实验报告

工训中心的牛马实验 实验目的 1.熟悉直流电路的测量和分析方法。 2.熟悉直流电源、电压表、电流表的使用法及其特性。 实验仪器和器材 1.实验仪器 直流稳压电源型号:IT6302 台式多用表型号:UT805A 2.实验&#xff08;箱&#xff09;器材 电路实验箱 元器件&#xff1a;电阻…

Ubuntu/Linux 升级 CMake 版本

Ubuntu/Linux 升级 CMake 版本 背景 在 Ubuntu 18.04 系统上默认的 CMake 版本为 3.10.2&#xff0c;当需要进行一些比较新的项目的编译时&#xff0c;比如说 iceoryx 的交叉编译&#xff0c;会遇到 CMake 版本不支持问题。类似下面的打印&#xff1a; CMake Error at CMakeL…

各种产品图的画法

经常看到网上有人问&#xff0c;产品经理要画哪些图&#xff0c;怎么画流程图等关于画图的问题。确实&#xff0c;画图是产品经理必备的硬核技能。然而&#xff0c;画图又不仅仅是画几个图而已。做产品没有统一、标准的规范指导&#xff0c;容易让人为了画图而画图。甚至&#…

机器学习笔记之狄利克雷过程(一)基本介绍

机器学习笔记之狄利克雷过程——基本介绍引言回顾&#xff1a;高斯混合模型狄利克雷过程——引出引言 从本节开始&#xff0c;将介绍狄利克雷过程。 回顾&#xff1a;高斯混合模型 高斯混合模型(Gaussian Mixture Model,GMM\text{Gaussian Mixture Model,GMM}Gaussian Mixtu…

【吃透Js】深入学习浅拷贝和深拷贝

一、JavaScript数据类型原始类型对象类型二、原始类型和对象类型的区别1.原始类型2.引用类型3.复制4.比较5.值传递三、浅拷贝概念实现方法四、深拷贝概念五、浅拷贝、深拷贝和赋值的区别浅拷贝和赋值六、小结想要真正搞明白深浅拷贝&#xff0c;你必须要熟练掌握赋值、对象在内…