Java枚举详解

news2025/1/14 2:42:29

一.枚举

  1.为什么有枚举?

如果我们的程序需要表示固定的几个值:

比如季节:spring (春),summer(夏),autumn(秋),winter(冬)

用常量表示:

        public static final int SEASON_SPRING = 1;
        public static final int SEASON_SUMMER = 2;
        public static final int SEASON_AUTUMN = 3;
        public static final int SEASON_WINTER = 4;

用常量表示季节的弊端

 1.代码不够简洁

 2.不同类型的数据是通过名字区分的

 3.不安全,由于是数字类型,就有可能使用这几个值做一些运算操作;比如:

SEASON_SPRING + SEASON_SUMMER

为了间接的表示一些固定的值,Java就给我们提供了枚举。

2.枚举的格式

概念:

       枚举:是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内。

格式:

      public  enum  s {

                       枚举项1,枚举项2,枚举项3;

       }

定义枚举类要用关键字enum

练习:

   定义一个枚举类,用来表示春,夏,秋,冬这四个固定值

package com.gch.d5_enum.demo1;

/**
   定义枚举类
 */
public enum Season {
    SPRING,SUMMER,AUTUMN,WINTER;
}

3.枚举的特点

   1.所有枚举类都是Enum的子类
   2.我们可以通过"枚举类名.枚举项名称"去访问指定的枚举项

   3.每一个枚举项其实就是该枚举的一个对象
   4.枚举也是一个类,也可以去定义成员变量
   5.枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的,
      但是如果枚举类有其他的东西,这个分号就不能省略。建议不要省略
   6.枚举类可以有构造器,但必须是private的,它默认也是private的。
      枚举项的用法比较特殊:枚举("");
   7.枚举类也可以有抽象方法,但是枚举项必须重写该方法。

   8.如果枚举项的后面什么都不写,那么此时它就默认调用枚举项的空参构造,如果想让它不        报错,只有让每一个枚举项去调用有参构造:枚举项(参数1,参数2){}

package com.gch.d5_enum.demo2;

/**
   定义枚举类
 */
public enum Season {
    // 5.枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的,
    //   但是如果枚举类有其他的东西,这个分号就不能省略。建议不要省略

    // 如果枚举项的后面什么都不写,那么此时它就默认调用枚举项的空参构造
    // 如果想让它不报错,只有让每一个枚举项去调用有参构造:枚举项(参数1,参数2){}
    SPRING("春"){
        // 如果枚举类中有抽象方法
        // 那么在枚举项中必须要全部重写
        @Override
        public void show() {
            System.out.println(this.name);
        }
    },
    SUMMER("夏"){
        @Override
        public void show() {
            System.out.println(this.name);
        }
    },
    AUTUMN("秋"){
        @Override
        public void show() {
            System.out.println(this.name);

        }
    },
    WINTER("冬"){
        @Override
        public void show() {
            System.out.println(this.name);
        }
    };

//    4.枚举也是一个类,也可以去定义成员变量
    public String name;

    // 空参构造
//    private Season(){}

    // 有参构造
    private Season(String name){
        this.name = name;
    }

    // 抽象方法
    public abstract void show();
}
package com.gch.d5_enum.demo2;

public class EnumDemo {
    public static void main(String[] args) {
        // 第二个特点的演示
        // 2.我们可以通过"枚举类名.枚举项名称"去访问指定的枚举项
        System.out.println(Season.SPRING);
        System.out.println(Season.SUMMER);
        System.out.println(Season.AUTUMN);
        System.out.println(Season.WINTER);

        // 第三个特点的演示
        //  3.每一个枚举项其实就是该枚举的一个对象
         Season spring = Season.SPRING;
    }
}

 4.枚举的方法

  1. String name() 获取枚举项的名称
  2. int ordinal() 返回枚举项在枚举类中的索引值, 枚举项在枚举类中它也是有索引的
  3. int compareTo(E o) 比较两个枚举项,返回的是索引值的差值
  4. String toString() 返回枚举常量的名称
  5. static <T> T valueOf(Class<T> type,String name)

                                          字节码文件对象  枚举项的名称
           ,它是一个静态方法,获取指定枚举类中的指定名称的枚举值

     6. values()  获得所有的枚举项

package com.gch.d5_enum.demo3;

/**
   定义枚举类
 */
public enum Season {
    SPRING,SUMMER,AUTUMN,WINTER;
}
package com.gch.d5_enum.demo3;

public class EnumDemo {
    public static void main(String[] args) {
        // String name() 获取枚举项的名称
         String name = Season.SPRING.name();
         System.out.println(name); // SPRING
        System.out.println("---------------------");

        // int ordinal() 返回枚举项在枚举类中的索引值
         int index1 = Season.SPRING.ordinal();
         int index2 = Season.SUMMER.ordinal();
         int index3 = Season.AUTUMN.ordinal();
        int index4 = Season.WINTER.ordinal();
        // 枚举项在枚举类中它也是有索引的
        System.out.println(index1); // 0
        System.out.println(index2); // 1
        System.out.println(index3); // 2
        System.out.println(index4); // 3
        System.out.println("----------------------");

        // int compareTo(E o) 比较两个枚举项,返回的是索引值的差值
        int result = Season.SPRING.compareTo(Season.WINTER);
        System.out.println(result); // 0 - 3 = -3
        System.out.println("-----------------------");

        // String toString() 返回枚举常量的名称
        String s = Season.SPRING.toString();
        System.out.println(s); // SPRING
        System.out.println("------------------");

        // static <T> T valueOf(Class<T> type,String name)
        //                      字节码文件对象  枚举项的名称
        // 它是一个静态方法,获取指定枚举类中的指定名称的枚举值
        Season spring = Enum.valueOf(Season.class, "SPRING");
        System.out.println(spring); // SPRING
        System.out.println(Season.SPRING == spring); // true
        System.out.println("--------------------------");

        // values()  获得所有的枚举项
        Season[] values = Season.values();
        for (int i = 0; i < values.length; i++) {
            System.out.println(values[i]);
        }
    }
}

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

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

相关文章

机械键盘不只有轴体的区别!键帽高度也有些学问

键盘键帽的学问有很多&#xff0c;上篇文章中&#xff0c;笔者和大家聊了键帽的材质和耐油污的问题。 除此之外&#xff0c;键帽的高度和字符的印刷方式也有不同&#xff0c;对于多数机械键盘来说&#xff0c;会发现每一列键帽的倾斜角度都略有不同&#xff0c;使用起来可以减少…

vue在history模式下打包部署问题解决

引言 项目使用的模板是element-template&#xff0c;由于业务需要&#xff0c;我将路由的hash模式更改为了history模式&#xff0c;然后在打包部署项目时就出现了问题 个人发现是资源的访问路径有问题&#xff0c;在部署之后发现每次访问的js资源路径前都会自动携带上我路由的…

如何使用SpringBoot ⽇志?

Spring Boot自定义日志的打印:在一个类中先获取到打印日志对象&#xff08;日志框架提供的日志对象&#xff0c;而日志框架默认已经集成到Spring Boot里了&#xff0c;springboot默认使用 slf4jlogback);注意&#xff1a;得到日志对象Logger ->来自于slf4j2、使用目志对象提…

Operator-sdk 在 KaiwuDB 容器云中的使用

一、使用背景KaiwuDB Operator 是一个自动运维部署工具&#xff0c;可以在 Kubernetes 环境上部署 KaiwuDB集群&#xff0c;借助 Operator 可实现无缝运行在公有云厂商提供的 Kubernetes 平台上&#xff0c;让 KaiwuDB 成为真正的 Cloud-Native 数据库。使用传统的自动化工具会…

深度学习之 imgaug (图像增强)学习笔记

深度学习之 imgaug &#xff08;图像增强&#xff09;前言1\. 安装和卸载2\. 示例2.1 基本使用2.2 包含常用的变换示例3 Augmenters常用函数3.1 iaa.Sequential()3.2 iaa.someOf()3.3 iaa.OneOf()3.4 iaa.Sometimes()3.5 iaa.WithColorspace()3.6 iaa.WithChannels()3.7 iaa.No…

KingbaseES V8R3 表加密

前言 透明加密是指将数据库page加密后写入磁盘&#xff0c;当需要读取对应page时进行加密读取。此过程对于用户是透明&#xff0c; 用户无需干预。 该文档进行数据库V8R3版本测试透明加密功能&#xff0c;需要说明&#xff0c;该版本发布时间早于V8R6&#xff0c;所以只能进行表…

我带过的一名C++实习生——Z同学

刚开始带Z同学&#xff0c;吃饭聊天时&#xff0c;我顺便了解了下他的擅长&#xff1a;linux平台下C、C网络编程。 接下来的实习&#xff0c;主要分为两个阶段&#xff1a;小组公共培训和项目实训。 小组公共培训为期2周&#xff0c;主要学习和了解公司文化制度&#xff0c;讲师…

【项目设计】高并发内存池(三)[CentralCache的实现]

&#x1f387;C学习历程&#xff1a;入门 博客主页&#xff1a;一起去看日落吗持续分享博主的C学习历程博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 也许你现在做的事情&#xff0c;暂时看不到成果&#xff0c;但不要忘记&…

脏牛复现(CVE2016-5195)

nmap扫描全网段&#xff0c;发现存货主机&#xff0c;ip为192.168.85.141nmap 192.168.85.0/24nmap 扫描端口&#xff0c;发现80端口&#xff0c;访问该网站nmap -p1-65535 192.168.85.141扫描该网站目录&#xff0c;什么也没扫出来 &#xff0c;dirb扫描目录的字典在usr/share…

Android TV UI开发常用知识

导入依赖 Google官方为Android TV的UI开发提供了一系列的规范组件&#xff0c;在leanback的依赖库中&#xff0c;这里介绍一些常用的组件&#xff0c;使用前需要导入leanback库。 implementation androidx.leanback:leanback:$version常用的页面 这些Fragment有设计好的样式&…

RocketMQ的一些使用理解

1.RocketMQ的生产者生产负载策略&#xff08;3种&#xff09; (1)SelectMessageQueueByHash &#xff08;一致性hash&#xff09; (2)SelectMessageQueueByMachineRoom &#xff08;机器随机&#xff09; (3)SelectMessageQueueByRandom &#xff08;随机&#xff09; 第1种一…

字符流定义及如何深入理解字符流的编码

IputSrem类和OupuSrem类在读写文件时操作的都是字节&#xff0c;如果希望在程序中操作字符&#xff0c;使用这两个类就不太方便&#xff0c;为此JDK提供了字符流。同字节流样&#xff0c;字符流也有两个抽象的顶级父类&#xff0c;分别是Reader和Writer其中&#xff0c;Reader是…

Nvidia jetson nano硬件架构

资料来源 官方文档中心 https://developer.nvidia.com/embedded/downloads -> 选jetson -> Jetson Nano Product Design Guide //产品设计指导(入口) //-> 1.1 References 列出了相关的文档 -> Jetson Nano Developer Kit Carrier Board Specification //板子标注…

MySQL实战之深入浅出索引(下)

1.前言 在上一篇文章中&#xff0c;我们介绍了InnoDB索引的数据结构模型&#xff0c;今天我们再继续聊一下跟MySQL索引有关的概念。 在介绍之前&#xff0c;我们先看一个问题&#xff1a; 表初始化语句 mysql> create table T ( ID int primary key, k int NOT NULL DEFA…

LeetCode 1237. Find Positive Integer Solution for a Given Equation【双指针,二分,交互】

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

Linux学习--重定向

重定向的意思是&#xff0c;将数据传到其他地方。 符号解释>输出覆盖重定向>>输出追加重定向<或<<标准输入重定向 1、读取文件内容且写入到另一个文件中&#xff0c;覆盖写入文件内容 cat haha.txt > xixi.txt2、追加写入文件内容 cat haha.txt >&g…

2023,年轻人不想买钻石了?

【潮汐商业评论/ 原创】“钻石恒久远&#xff0c;一颗永流传。”很明显&#xff0c;Lily就是这句话的“受害者”。临近婚期的她&#xff0c;在婚戒的选择上犯起了愁&#xff0c;“我现在想到买钻戒&#xff0c;我就头大。买小的凑合一下&#xff0c;耳边传来的都是‘别买一克拉…

Linux命令篇 linux命令大全简洁明了 linux学习笔记

Linux命令篇 linux命令大全简洁明了 linux学习笔记 Linux 命令大全 文章目录Linux 命令大全一、 常用的基础命令查看目录&#xff1a;切换目录&#xff1a;创建和删除&#xff1a;拷贝和移动文件&#xff1a;查看文件内容&#xff1a;其他&#xff1a;小技巧终端命令格式1.1 ls…

如何用3个月零基础入门网络安全?

背景 写这篇教程的初衷是很多朋友都想了解如何入门/转行网络安全&#xff0c;实现自己的“黑客梦”。文章的宗旨是&#xff1a;1.指出一些自学的误区 2.提供客观可行的学习表 3.推荐我认为适合小白学习的资源.大佬绕道哈&#xff01; 一、自学网络安全学习的误区和陷阱 1.不…

基于Conda完成创建多版本python环境

文章目录基于Conda完成创建多版本python环境基于Conda完成创建多版本python环境 通过cmd打开conda环境 d:\ProgramData\Anaconda3\Scripts\activate创建python3.7的环境 conda create -n py3.7 python3.7产生错误 Collecting package metadata (repodata.json): failed Unav…