enum枚举类 - Java

枚举类

  • 一、引入
  • 二、介绍
  • 三、实现方式
    • 1、 自定义类实现枚举
      • 小结
    • 2、 enum关键字实现枚举
  • 四、使用enum注意事项
  • 五、练习
  • 六、enum常用方法
  • 七、练习
  • 八、enum和接口

一、引入

要求创建季节(Season)对象,请设计并完成。

  • 传统方法:
public class Enumeration01 {
    public static void main(String[] args) {
        Season spring = new Season("春天", "温暖的");
        Season summer = new Season("夏天", "炎热的");
        Season autumn = new Season("秋天", "凉爽的");
        Season winter = new Season("冬天", "寒冷的");
    }
}

class Season {
    private String name;
    private String desc;//描述

    public Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    public String getName() { return name;}

    public void setName(String name) { this.name = name;}

    public String getDesc() { return desc;}

    public void setDesc(String desc) { this.desc = desc;}
}

创建Season对象有如下特点
① 季节的值是有限的几个值(spring, summer, autumn, winter)。
② 只读,不需要修改。

按这个思路设计这种类,不能体现季节是固定的四个对象。

二、介绍

  1. 枚举对应英文(enumeration,简写enum)
  2. 枚举是一组常量的集合。
  3. 可以这里理解:枚举属于一种特殊的类,里面只包含一组有限的特定的对象。

三、实现方式

  1. 自定义类实现枚举
  2. 使用enum关键字实现枚举

1、 自定义类实现枚举

防止直接new => ① 构造器私有化
防止别人修改season的参数 => ② 去掉set相关方法
保持Season固定四个 => ③ 在Season内部,直接创建固定的对象
让别人直接用固定的对象 => ④ static

public class Enumeration02 {
    public static void main(String[] args) {
        System.out.println(Season.SPRING);
        System.out.println(Season.SUMMER);
        System.out.println(Season.AUTUMN);
        System.out.println(Season.WINTER);
    }
}
class Season {
    private String name;
    private String desc;//描述
    public static Season SPRING = new Season("春天", "温暖的");
    public static Season SUMMER = new Season("夏天", "炎热的");
    public static Season AUTUMN = new Season("秋天", "凉爽的");
    public static Season WINTER = new Season("冬天", "寒冷的");

    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. 不需要提供setXxx方法,因为枚举对象值通常为只读。
  2. 对枚举对象/属性使用final + static共同修饰,实现底层优化。
    加final不会导致static类的加载,不是说new不会加载。
  3. 枚举对象名通常使用全部大写,常量的命名规范。
  4. 枚举对象根据需要,也可以有多个属性。Enumeration02.java
  • 方法总结
  1. 构造器私有化
  2. 本类内部创建一组对象四个春夏秋冬]
  3. 对外暴露对象(通过为对象添加 public final static修饰符)
  4. 可以提供get方法,但是不要提供set

2、 enum关键字实现枚举

如果使用了enum来实现枚举类
① 使用关键字enum替代 class
② public static final Season SPRING = new Season(“春天”,“温暖")直接使用 SPRING(“春天”,“温暖") 代替
解读:常量名(实参列表) : 实参列表和构造器参数列表相同
③ 如果有多个常量对象,使用《逗号》间隔即可
④ 如果使用enum 来实现枚举,要求将定义的常量对象,写在前面

//① 使用关键字enum替代 class
enum Season2 {
//    ② 常量名(实参列表)
//    ④ 如果使用enum 来实现枚举,要求将定义的常量对象,写在前面
    SPRING("春天", "温暖"), //③ 如果有多个常量对象,使用《逗号》间隔即可
    SUMMER("夏天", "炎热"),
    AUTUMN("秋天", "凉爽"),
    WINTER("冬天", "寒冷");
    private String name;
    private String desc;//描述

    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注意事项

  1. 当我们使用enum关键字开发一个枚举类时,默认会继承Enum类,而且是一个final类。
    [证明] 使用 javap 证明 【见下文 案例 a】
    《hello.java》文件 通过 [ javac ] 指令进行编译,编译为《hello.class》
    反编译使用 [ javap ]
  2. 传统的 public static final Season2 SPRING = new Season2(“春天”,“温暖“);简化成SPRING(“春天”“温暖”),这里必须知道,它调用的是哪个构造器。
  3. 如果使用无参构造器创建枚举对象,则实参列表和小括号都可以省略。【见下文 案例 b】
  4. 当有多个枚举对象时,使用逗号间隔,最后有一个分号结尾
  5. 枚举对象必须放在枚举类的行首

【 案例 a 】
在这里插入图片描述
在这里插入图片描述
【 案例 b 】
第三行的 WHAT()是使用了无参构造器,也可以去掉小括号。

enum Season2 {
    SPRING("春天", "温暖"), SUMMER("夏天", "炎热"),
    AUTUMN("秋天", "凉爽"),WINTER("冬天", "寒冷"), WHAT();
    private String name;
    private String desc;//描述

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

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

五、练习

  • 题1 是否正确
enum Gender{ 
	BOY,GIRL;
}

答案:

  1. 上面语法正确
  2. 枚举类Gender,没有属性,可以去掉小括号。
  3. 有两个枚举对象 BOY, GIRL使用的无参构造器创建。
  4. 此时的无参构造器是存在的
    如果是下面这种写法,无参构造器被覆盖,就是错的。
enum Gender{  //错
	BOY,GIRL;
	private Gender(String name) {}
}
  • 题2 输出
enum Gender2{
	BOYGIRL;
}

Gender2 boy = Gender2.BOY; (1)
Gender2 boy2 = Gender2.BOY; (2)
System.out.println(boy); (3)
System.out.println(boy2 == boy); (4)

答案:
(1) 正确
(2) 正确
(3) 本质是调用 Gender2 的 父类的 toString。
Gender2 是enum类,是Enum类的子类。
在这里插入图片描述
输出:BOY
(4) TRUE。因为对象是静态的,public static final。

六、enum常用方法

【跳转】enum常用方法

七、练习

public class EnumExercise01 {
    public static void main(String[] args) {
        Week[] values = Week.values();
        System.out.println("=="+"所有星期的信息如下"+"==");
        for (Week v : values) {
            System.out.println(v.getCname());
        }
    }
}
enum Week {
    MONDAY("星期一"),
    TUESDAY("星期二"),
    WEDNESDAY("星期三"),
    THURSDAY("星期四"),
    FRIDAY("星期五"),
    SATURDAY("星期六"),
    SUNDAY("星期日");

    private String cname;//chinese name
    private Week(String cname) {
        this.cname = cname;
    }

    public String getCname() {
        return cname;
    }
}

注意这里可以改写 toString方法,然后在 main 方法的 for 循环中直接 println(v)

八、enum和接口

  1. 使用enum关键字后,就不能再继承其它类了,因为enum会隐式继承Enum,而Java是单继承机制。
  2. 枚举类和普通类一样,可以实现接口,如下形式。
enum 类名 implements 接口1,接口2 {
}
interface IPlaying {
    public void playing();
}
enum Music implements IPlaying {
    CLASSIC_MUSIC;

    @Override
    public void playing() {
        System.out.println("播放好听的音乐");
    }
}

本笔记是对韩顺平老师的Java课程做出的梳理。方便本人和观看者进行复习。
课程请见: https://www.bilibili.com/video/BV1fh411y7R8/?spm_id_from=333.999.0.0&vd_source=ceab44fb5c1365a19cb488ab650bab03

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

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

相关文章

牛客算法心得——kotori和素因子(dfs)

大家好,我是晴天学长,传智杯的题,一个经典的全排列找最小的问题,需要的小伙伴可以关注支持一下哦!后续会继续更新的。💪💪💪 1) .kotori和素因子 链接:https://ac.nowcod…

运维知识点-openResty

openResty 企业级实战——畅购商城SpringCloud-网站首页高可用解决方案-openRestynginxlua——实现广告缓存测试企业级实战——畅购商城SpringCloud-网站首页高可用解决方案-openRestynginxlua——OpenResty 企业级实战——畅购商城SpringCloud-网站首页高可用解决方案-openRes…

鸿蒙【HarmonyOS】开发初体验

官方开发文档 依照官方开发文档进行配置,官方的文档很详细(虽然有些粗糙)。 其实只要下载了deveco studio,其他就按照next来就行了。配置都很清楚。 顺便提一下,deveco是基于intellij 的,体验很不错&…

Android性能优化- 从SharedPreferences到MMKV

前言 前面Android性能优化 - 从SharedPreferences跨越到DataStore一文主要介绍了DataStore的实现原理,以及DataStore相对于SharedPreferences的提升,本文主要简述MMKV相对于SharedPreferences存储的使用及优劣势,以及MMKV原理,以…

chrome 调试之 - 给微软小冰看病(无论给小冰发送什么内容都只回复“我已经开始升级啦,期待一下吧!”)

微软 Bing 搜索推出了小冰AI智能聊天模块,具体启用方式是用edge或chrome浏览器打开链接 cn.bing.com 后在输入框搜索任意内容,待搜索结果页面加载完并稍等片刻,页面右侧就会出现一个躲在滚动条后面的小萝莉,抚摸...不,…

elementui中table进行表单验证

<el-form :model"ruleForm" ref"ruleForm" class"demo-ruleForm"><el-table :data"ruleForm.tableDataShou" border style"width: 100%;"><el-table-column type"index" label"序号" wi…

数据预处理:随机裁剪放缩

随机裁剪放缩是一种数据增强技术&#xff0c;可以在训练神经网络时增加数据的多样性&#xff0c;提高模型的泛化能力。具体来说&#xff0c;随机裁剪放缩可以通过随机裁剪和缩放原始图片来生成多个不同的训练样本&#xff0c;从而增加数据集的大小和多样性。这种技术在图像分类…

Flink-时间流与水印

时间流与水印 一、背景二、时间语义1.事件时间&#xff08;event time&#xff09;2.读取时间&#xff08;ingestion time&#xff09;3.处理时间&#xff08;processing time&#xff09; 三、水印-Watermarks1.延迟和正确性2.延迟事件3.顺序流4.无序流5.并行流 四、Windows1.…

Redis对象系统

前言 在Redis中有许多数据结构&#xff0c;比如&#xff1a;简单动态字符串(SDS)&#xff0c;双端链表&#xff0c;字典&#xff0c;压缩列表&#xff0c;整数集合等。 Redis并没有直接使用这些数据结构来实现键值对数据库&#xff0c;而是基于这些数据结构创建了一个对象系统。…

脚本格式问题记录

服务器上的一些脚本迁移到其他服务上发生的小问题 问题&#xff1a;执行一个在win10系统编写好的shell脚本&#xff0c;放到Linux上执行报错如下&#xff1a; bash: ./xxx.sh: /bin/bash^M: bad interpreter: No such file or directory 原因&#xff1a;window系统写的脚本&a…

【Spring Boot 源码学习】BootstrapRegistryInitializer 详解

Spring Boot 源码学习系列 BootstrapRegistryInitializer 详解 引言往期内容主要内容1. 初识 BootstrapRegistryInitializer2. 加载 BootstrapRegistryInitializer3. BootstrapRegistryInitializer 的初始化 总结 引言 书接前文《初识 SpringApplication》&#xff0c;我们从 …

A*算法学习

系列文章目录 前言 在总结 2023华为软件精英挑战赛——全赛段思路分享与总结 - 知乎 (zhihu.com)时&#xff0c;发现自己还有很多技术细节没搞懂&#xff0c;这里看静态全局路径规划最常见的A*算法&#xff0c;这个博主讲得很好&#xff1a; A-Star&#xff08;A*&#xff0…

第十五届蓝桥杯(Web 应用开发)模拟赛 2 期-大学组(详细分析解答)

目录 1.相不相等 1.1 题目要求 1.2 题目分析 1.3 源代码 2.三行情书 2.1 题目要求 2.2 题目分析 2.3 源代码 3.电影院在线订票 3.1 题目要求 3.2 题目分析 3.3 源代码 4.老虎坤&#xff08;不然违规发不出来&#xff09; 4.1 题目要求 4.2 题目分析 4.3 源代码 …

mac 聚焦搜索不显示

我是连搜索框都不显示&#xff0c;不是搜索结果显示异常 点右上角的搜索按钮都毫无反应 我检查过快捷键之类的设置&#xff0c;都正常&#xff0c;最后是通过删除文件解决的 cd ~/Library/Preferences/ rm com.apple.Spotlight.plist 重启 mac 参考 Spotlight Search Not W…

“rhdf5filters.so’ not found when install ‘glmGamPoi‘ package

在R中安装glmGamPoi包的时候&#xff0c;出现了如下报错&#xff1a; install.packages(glmGamPoi) 尝试方案一&#xff1a; sudo apt install pkg-config libhdf5-dev安装lighdf5-dev&#xff0c;并将安装路径链接至usr/lib/文件。 locate rhdf5filters.so sudo ln -s /hom…

java-var类型推断的使用时机

写在前面&#xff1a; 在jdk9的时候引入了var关键字&#xff0c;但是这是一把双刃剑&#xff0c;使用的好的话可以简化代码提高可读性&#xff0c;如果使用的不好的话会导致反效果。 文章目录 使用原则推荐使用时机new关键字创建对象类型不重要for循环 不适合与泛型大量结合字…

【Java学习笔记】75 - 算法优化入门 - 马踏棋盘问题

一、意义 1.算法是程序的灵魂&#xff0c;为什么有些程序可以在海量数据计算时&#xff0c;依然保持高速计算? 2.拿老韩实际工作经历来说&#xff0c;在Unix下开发服务器程序&#xff0c;功能是要支持上千万人同时在线&#xff0c;在上线前&#xff0c; 做内测&#xff0c;一…

vuepress-----9、PWA

# 9、PWA 使用babel 的插件形式 [vuepress/pwa,{serviceWorker: true,updatePopup: {message: "New content is available.",buttonText: "Refresh"}}]提供 Manifest 和 icons (opens new window) 拷贝到public目录下 发布后出现 service workers [外链图片…

Spring第三课,Lombok工具包下载,对应图书管理系统列表和登录界面的后端代码,分层思想

目录 一、Lombok工具包下载 二、前后端互联的图书管理系统 规范 三、分层思想 三层架构&#xff1a; 1.表现层 2.业务逻辑层 3.数据层 一、Lombok工具包下载 这个工具包是为了做什么呢&#xff1f; 他是为了不去反复的设置setting and getting 而去产生的工具包 ⚠️工具…

二叉树(判断是否为对称二叉树)

题目&#xff08;力扣&#xff09;&#xff1a; 观察题目&#xff0c;只需判断该二叉树是否对称。 判断二叉树是否对称&#xff0c;就可以换位去判断该二叉树的左子树和右子树是否对称。 这时就可以写一个辅助函数来方便判断。 该函数是判断两颗树是否镜像对称&#xff0c;这…