枚举的使用

目录

什么是枚举

使用自定义枚举的步骤

自定义类实现枚举-小结

enum关键字实现枚举注意事项

enum练习

第一题

第二题

enum常用方法应用

enum实现接口细节

Enum习题

第一题


什么是枚举

枚举简称(enmu)

枚举是一组常量的集合

可以理解成:枚举属于一种特殊的类,里面只包含一组有限的特点对象

实现枚举有两种方式 一种是自定义枚举 还有一种是使用枚举关键字

使用自定义枚举的步骤

自定义类实现枚举

1.不需要提供setXxx方法,因为枚举对象值通常为只读.

2.对枚举对象/属性使用final+static共同修饰,实现底层优化.

3.枚举对象名通常使用全部大写,常量的命名规范.

4.枚举对象根据需要,也可以有多个属性

代码演示:

package idea.chapter11.enum_;

/**
 * 演示自定义枚举的基本使用
 */

public class Enumeration02 {
    public static void main(String[] args) {
        System.out.println(Season.AUTUMN);
        System.out.println(Season.SPRING);
    }
}

//演示字定义枚举实现
class Season {//类
    private String name;
    private String desc;//描述

    //定义了四个对象, 固定.
    public static final Season SPRING = new Season("春天", "温暖");
    public static final Season WINTER = new Season("冬天", "寒冷");
    public static final Season AUTUMN = new Season("秋天", "凉爽");
    public static final Season SUMMER = new Season("夏天", "炎热");


    //1. 将构造器私有化,目的防止 直接 new
    //2. 去掉setXxx方法, 防止属性被修改
    //3. 在Season 内部,直接创建固定的对象
    //4. 优化,可以加入 final 修饰符
    private Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

    @Override
    public String toString() {
        return "Season{" +
                "name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}

自定义类实现枚举-小结

小结:进行自定义类实现枚举,有如下特点:

1)构造器私有化

2)本类内部创建一组对象

3)对外暴露对象(通过为对象添加public final static修饰符)

4)可以提供 get方法,但是不要提供 set

enum关键字实现枚举注意事项

1.当我们使用enum关键字开发一个枚举类时,默认会继承Enum类,而且是一个final类[如何证明],使用javap工具来演示

2.传统的public static final Season2 SPRING =new Season2("春天”,"温暖 ");简化成SPRING("春天”,"温暖"),这里必须知道,它调用的是哪个构造器。主要看后面的括号如果有两个参数,说明调用的就是带两个参数的构造器

3.如果使用无参构造器 创建 枚举对象,则实参列表和小括号都可以省略

4.当有多个枚举对象时,使用,间隔,最后有一个分号结尾

5.枚举对象必须放在枚举类的行首.

代码演示:

package idea.chapter11.enum_;

public class Enumeration03 {
    public static void main(String[] args) {
        System.out.println(Season2.AUTUMN);
        System.out.println(Season2.SUMMER);
        /*
        结论:
        1.当我们使用enum关键字开发一个枚举类时,默认会继承Enum类,而且是一个final类[如何证明],使用javap工具来演示
        2.传统的public static final Season2 SPRING =new Season2("春天”,"温暖 ");简化成SPRING("春天”,"温暖"),这里必须知道,它调用的是哪个构造器。主要看后面的括号如果有两个参数,说明调用的就是带两个参数的构造器
        3.如果使用无参构造器 创建 枚举对象,则实参列表和小括号都可以省略
        4.当有多个枚举对象时,使用,间隔,最后有一个分号结尾
        5.枚举对象必须放在枚举类的行首.
         */
    }
}

//演示使用enum关键字来实现枚举类
enum Season2 {//类

    //定义了四个对象, 固定.
//    public static final Season SPRING = new Season("春天", "温暖");
//    public static final Season WINTER = new Season("冬天", "寒冷");
//    public static final Season AUTUMN = new Season("秋天", "凉爽");
//    public static final Season SUMMER = new Season("夏天", "炎热");

    //两种方式的对比
    //和之前的自定义枚举对比

    //如果使用了enum 来实现枚举类
    //1. 使用关键字 enum 替代 class
    //2. public static final Season SPRING = new Season("春天", "温暖") 直接使用  SPRING("春天", "温暖")来替代    常量名(实参列表),这里的实参列表和我们类的构造器对应
    //3. 如果有多个常量(对象), 使用 ,号间隔即可
    //4. 如果使用enum 来实现枚举,要求将定义常量对象,写在前面,否则会报错,这是语法
    //5. 如果我们使用的是无参构造器,创建常量对象,则可以省略 ()

    //2.传统的public static final Season2 SPRING =new Season2("春天”,"温暖 ");简化成SPRING("春天”,"温暖"),这里必须知道,它调用的是哪个构造器。主要看后面的括号如果有两个参数,说明调用的就是带两个参数的构造器
    //SPRING("春天", "温暖")这就表示调用的是Season2类的带两个参数的构造器
    //5.枚举对象必须放在枚举类的行首.
    SPRING("春天", "温暖"), WINTER("冬天", "寒冷"), AUTUMN("秋天", "凉爽"),
    //3.如果使用无参构造器 创建 枚举对象,则实参列表和小括号都可以省略
    SUMMER("夏天", "炎热")/*, What*/;//4.当有多个枚举对象时,使用,间隔,最后有一个分号结尾

    private String name;
    private String desc;//描述

    private Season2() {//无参构造器

    }

    private Season2(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

    @Override
    public String toString() {
        return "Season{" +
                "name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}

enum练习

第一题

思路分析:

//这里其实就是调用Gender类的无参构造器
1)上面语法是ok
2)有一个枚举类Gender,没有属性。
3)有两个枚举对象 BOY,GIRL,使用的无参构造器创建.

下面代码是否正确,并说明表示的含义?
enum Gendert{
	BOY,GIRL;    
}
//这里其实就是调用Gender类的无参构造器
1)上面语法是ok
2)有一个枚举类Gender,没有属性。
3)有两个枚举对象 BOY,GIRL,使用的无参构造器创建.

第二题

思路分析:
1.在执行这两句话的时候都是没有问题
Gender2 boy = Gender2.BOY;//OK
Gender2 boy2 = Gender2.BOY;//OK
2.紧接着就输出了boy 因为知道在输出对象实例的时候,会自动调用toString()方法,因为Gender2类是enum修饰的,会自动继承Enum类,并且调用父类的toString()方法
  我们看Enum中的toString方法的源码
  public String toString(){
        return name;
  }

  同过源码我们可以清楚的知道,返回的就是一个名字
  所以在输出boy的时候,输出的就是BOY,输出的就是自己本身

System.out.println(boy2 == boy);  //True
最后在判断boy2 和 boy 是否相同的时候,因为是enum修饰,会自动继承Enum类,并且在底层还会进行优化,是public static final 修饰的,因为是静态的所以访问的 都是同一个地方,因此返回true
并且Gender2.BOY 的本质是静态性质的,所以赋给boy 和 boy2本质是同一个对象
package idea.chapter11.enum_;

/**
 * 演示枚举的习题
 */
public class EnumExercise01 {
    public static void main(String[] args) {
        Gender2 boy = Gender2.BOY;//OK
        Gender2 boy2 = Gender2.BOY;//OK
        System.out.println(boy);//输出BOY //本质就是调用 Gender2 的父类Enum的 toString()
        //在输出boy时会默认的调用父类Enum的toString方法  改方法直接返回名字
        //使用enum关键字默认会继承Java.lang.Enum 这个包

//        public String toString() {
//            return name;
//        }

        /*
        思路分析:
        1.在执行这两句话的时候都是没有问题
        Gender2 boy = Gender2.BOY;//OK
        Gender2 boy2 = Gender2.BOY;//OK
        2.紧接着就输出了boy 因为知道在输出对象实例的时候,会自动调用toString()方法,因为Gender2类是enum修饰的,会自动继承Enum类,并且调用父类的toString()方法
          我们看Enum中的toString方法的源码
          public String toString(){
                return name;
          }

          同过源码我们可以清楚的知道,返回的就是一个名字
          所以在输出boy的时候,输出的就是BOY,输出的就是自己本身

        System.out.println(boy2 == boy);  //True
        最后在判断boy2 和 boy 是否相同的时候,因为是enum修饰,会自动继承Enum类,并且在底层还会进行优化,是public static final 修饰的,因为是静态的所以访问的 都是同一个地方,因此返回true
        并且Gender2.BOY 的本质是静态性质的,所以赋给boy 和 boy2本质是同一个对象
         */
        System.out.println(boy2 == boy);  //True
        //因为是都是静态的属性   enum关键字在编译时属性的类型都是
        // public static final 的  因为是静态所以指向的都是同一个地方所以返回true
    }
}

enum Gender2{ //父类 Enum 的toString
    BOY , GIRL;
}

enum常用方法应用

  1. toString:Enum类已经重写过了,返回的是当前对象名,子类可以重写该方法,用于返回对象的属性信息

  2. name:返回当前对象名(常量名),子类中不能重写

  3. ordinal:返回当前对象的位置号,默认从0开始

  4. values:返回当前枚举类中所有的常量

  5. valueOf:将字符串转换成枚举对象,要求字符串必须为已有的常量名,否则报异常!

  6. compareTo比较两个枚举常量,比较的就是位置号

代码演示:

package idea.chapter11.enum_;

/**
 * 演示Enum的各种方法
 */
public class EnumMethod {
    public static void main(String[] args) {
        Season2 autumn = Season2.AUTUMN;

        //输出枚举对象的名字
        System.out.println(autumn.name());
        
        //ordinal() 输出的是该枚举对象的次序/编号,从0开始编号
        //AUTUMN 枚举对象是第三个,因此输出 2
        System.out.println(autumn.ordinal());
        
        //从反编译可以看出 values方法,返回 Season2[] 
        //就是将枚举中的元素都放入到数组中
        Season2[] values = Season2.values();
        //增强for循环
        for (Season2 season: values) {
            System.out.println(season);
        }

        //valueOf:将字符串转换成枚举对象,要求字符串必须为已有的常量名,否则报异常
        //执行流程
        //1. 根据你输入的 "AUTUMN" 到 Season2的枚举对象去查找
        //2. 如果找到了,就返回,如果没有找到,就报错
        Season2 autumn1 = Season2.valueOf("AUTUMN");
        System.out.println("autumn1=" + autumn);
        //我们找到的autumn1和autumn是同一个对象,所以返回true
        System.out.println(autumn == autumn1);

        //compareTo:比较两个枚举常量,比较的就是编号
        //1. 就是把 Season2.AUTUMN 枚举对象的编号 和 Season2.SUMMER枚举对象的编号比较
        //2. 看看结果
        /*
        public final int compareTo(E o) {

            return self.ordinal - other.ordinal;
        }
        Season2.AUTUMN的编号[2] - Season2.SUMMER的编号[3]
         */
        System.out.println(Season2.AUTUMN.compareTo(Season2.SUMMER));
    }
}

enum实现接口细节

1)使用enum关键字后,就不能再继承其它类了,因为enum会隐式继承Enum,而Java是单继承机制。

2)枚举类和普通类一样,可以实现接口,如下形式。 enum 类名 implements接口1,接口2)

代码演示:

package idea.chapter11.enum_;

/**
 * 演示接口的细节
 */
public class EnumDetail {
    public static void main(String[] args) {
        /*
        1)使用enum关键字后,就不能再继承其它类了,因为enum会隐式继承Enum,而Java是单继承机制。
        2)枚举类和普通类一样,可以实现接口,如下形式。
        enum 类名 implements接口1,接口2)
         */
    }
}

//因为 enum会隐式的继承Enum类,因为Java是单继承机制,所有enum修饰的不能在继承其他类,但是可以实现接口
enum Animal implements eat {
    //DOG是一个枚举对象  没有参数默认调用无参构造器 枚举默认是public static final 修饰的所以可以通过类名直接调用
    DOG;

    @Override
    public void eat() {
        System.out.println("吃东西");
    }
}

interface eat {
    void eat();
}

Enum习题

第一题

代码演示:

package idea.chapter11.enum_;

public class EnumExercise02 {
    public static void main(String[] args) {
        /*
        enum课堂练习
        课堂完成EnumExercise02.java
        1)声明Week枚举类,其中包含星期一至星期日的定义; ===所有星期的信息如下==MONDAY, TUESDAY, WEDNESDAY, THURSDAY, 星期一
        FRIDAY, SATURDAY, SUNDAY; 星期二
        2)使用values返回所有的枚举数组,并遍历,输出左图
         */

        Week[] values = Week.values();
        System.out.println("===所有星期如下===");
        for (Week value : values) {
            System.out.println(value);
        }
    }
}

enum Week {
    MONDAY("星期一"), TUESDAY("星期二"), WEDNESDAY("星期三"), THURSDAY("星期四"), FRIDAY("星期五"), SATURDAY("星期六"), SUNDAY("星期日");
    private String name;

    Week(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return name;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

36岁大龄程序员被裁,找了2个月工作,年包从100万降到50万,要不要接?

为了找到工作,你愿意接受降薪多少? 一位36岁的杭州程序员问: 36岁被裁,找了2个月工作,年包从100万降到50万,真心纠结,要不要接? 网友们分成了旗帜鲜明的两派,一派人认为不…

【面试题】20个常见的前端算法题,你全都会吗?

现在面试中,算法出现的频率越来越高了,大厂基本必考 今天给大家带来20个常见的前端算法题,重要的地方已添加注释,如有不正确的地方,欢迎多多指正💕 大厂面试题分享 面试题库 前后端面试题库 (…

基于RDF本体模型和图数据库实现知识查询与推理

基于RDF本体模型和图数据库实现知识查询与推理 基于RDF本体模型和图数据库实现知识查询与推理一、案例本体模型解释二、数据构建与查询 Here’s the table of contents: 基于RDF本体模型和图数据库实现知识查询与推理 本文主要使用ONgDB图数据库和Neosemantics组件,…

运行时内存数据区之虚拟机栈——操作数栈

操作数栈 每一个独立的栈帧中除了包含局部变量表以外,还包含一个后进先出(Last-In-First-Out)的操作数栈,也可以称之为表达式栈(Expression Stack)。操作数栈,在方法执行过程中,根据字节码指令,往栈中写入数据或提取数…

《花雕学AI》06:抢先体验ChatGPT的九个国内镜像站之试用与综合评测

最近ChatGPT持续大火,大家们是不是在网上看到各种和ChatGPT有趣聊天的截图,奈何自己实力不够,被网络拒之门外,只能眼馋别人的东西。看别人在体验,看别人玩,肯定不如自己玩一把舒服的啊。 上一期&#xff0…

视图的使用

为什么引入视图(Views) 如果您读过其他类似的书,可能会看到这些书在介绍视图时列举了许多引入视图的原因。其中认为最重要的原因是维护数据的独立性。那么什么是数据的独立性呢? 早期信息系统的设计与开发多采用模块驱动方式&am…

如何使用Win10搭建我的世界Minecraft服务器

简单几步在windwos搭建我的世界服务器,并通过cpolar工具将本地服务暴露到公网连接 1. Java环境搭建 以windows10系统为例,配置java环境,搭建我的世界服务器,下载最新版java版本 Java Downloads | Oracle 选择exe文件,下载完成后双击安装包…

从Hive源码解读大数据开发为什么可以脱离SQL、Java、Scala

从Hive源码解读大数据开发为什么可以脱离SQL、Java、Scala 前言 【本文适合有一定计算机基础/半年工作经验的读者食用。立个Flg,愿天下不再有肤浅的SQL Boy】 谈到大数据开发,占据绝大多数人口的就是SQL Boy,不接受反驳,毕竟大…

开发者笑疯了! LLaMa惊天泄露引爆ChatGPT平替狂潮,开源LLM领域变天

来源: 新智源 微信号:AI-era Meta的LLaMA模型开源,让文本大模型迎来了Stable Diffustion时刻。谁都没想 谁能想到,一次意外的LLaMA泄漏,竟点燃了开源LLM领域最大的创新火花。 一系列表现出色的ChatGPT开源替代品——「羊驼家族」…

全网最详细,Jmeter性能测试-性能基础详解,接口关联与编写Java脚本(三)

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 接口关联 接口关联…

水塘抽样解决随机选择问题

1.简介 水塘抽样是一系列的随机算法,其目的在于从包含n个项目的集合S中选取k个样本,其中n为一很大或未知的数量,尤其适用于不能把所有n个项目都存放到内存的情况。最常见例子为Jeffrey Vitter在其论文中所提及的算法R。 2.算法步骤&#xff1…

机器学习算法系列(三)

机器学习算法之–对数几率回归(逻辑斯蒂回归)算法 上个算法(算法系列二)介绍了如何使用线性模型进行回归学习,但若要做的是分类任务,则需要找一个单调可微函数将分类任务的真实标记y与线性回归模型的预测值…

一次etcd变更引发的惨案

问题描述 在做etcd的数据变更时候,etcd在组成集群的时候出现leader不断切换问题,导致集群不稳定,都面将不健康的etcd节点踢出,只剩etcd单节点,后面将踢出的etcd节点重新加入现有etcd,导致etcd集群奔溃&…

【故障诊断】基于 KPCA 进行降维、故障检测和故障诊断研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

快速搭建第一个SpringCloud程序

目录 1、Spring Boot项目脚手架快速搭建 1.1 生成工程基本配置 1.2 生成工程。 1.3 导入开发工具(此处为Idea) 1.4 运行代码 1.5 验证是否能访问 2、Spring Cloud环境搭建 2.1 版本匹配问题 2.2 Spring Cloud环境测试 3、引入Eureka Server 3…

运行时内存数据区之虚拟机栈——局部变量表

这篇内容十分重要,文字也很多,仔细阅读后,你必定有所收获! 基本内容 与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stack)也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的线程内存模型&#xf…

【从零开始学Skynet】基础篇(六):MySql数据库安装操作

游戏服务端的另一项重要功能是保存玩家数据,Skynet提供了操作MySQL数据库、MongoDB数据库的模块。1、数据库安装 首先安装Mysql服务器,打开终端输入如下指令: sudo apt-get install mysql-server 按下回车,输入密码后开始安装&a…

项目1实现login登录功能方案设计第三版

需求优化点:MySQL表常用功能模块实现方案index页面home页面需求 实现一个登录功能 实现的功能 注册(邮箱注册)登录(邮箱密码)重置密码查看操作记录(登录, 注册, 重置密码, 登出. 都算操作)登出在第2版的基础上进行优化:\ 优化点: VerificationCode(验证码储存库): 增加时间字段…

青藤首提“业安融合”理念,正式发布先进云安全方案CNAPP

4月18日,以“云时代,安全变了”为主题的2023年云安全高峰论坛在北京举行。会上,青藤首次提出“业安融合”理念,正式发布先进云安全方案CNAPP。 中国全面进入云和数字化时代 当前,全球已进入数字经济时代,…

前端自动化测试之葵花宝典

首先聊一下概念,Web 前端自动化测试是一种通过编写代码来自动化执行 Web 应用程序的测试任务的方法,它通常使用 JavaScript 和测试框架 (如 Selenium、Appium 等) 来实现。 Web 前端自动化测试的优点是可以提高测试效率、减少测试时间和测试成本&#x…
最新文章