enum枚举类 - Java

news2024/11/24 18:00:10

枚举类

  • 一、引入
  • 二、介绍
  • 三、实现方式
    • 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

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

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

相关文章

【秒懂JDK,JRE,JVM的关系】

🌠作者:TheMythWS. 🎇座右铭:不走心的努力都是在敷衍自己,让自己所做的选择,熠熠发光。 ​ JDK与JRE与JVM的关系 先用一张图来直观感受JDK JRE JVM之间的关系: JDK与JRE的关系 先说JDK和JRE…

绩效考核管理项目|记录2

给界面添加筛选条件并且把搜索功能实现 这段代码写入搜索方法里面就能实现功能。 private void bingdgv(){//筛选项:用户名、职位代码、是否辞职string userName txtUserName.Text.Trim();int baseTypeId (int)base_cbx.SelectedValue;bool isStop isdel_ckb.Che…

Loki安装部署

Loki安装部署 1、Loki介绍 Loki 是受 Prometheus 启发由 Grafana Labs 团队开源的水平可扩展,高度可用的多租户日志聚合系统。开发语 言: Google Go。它的设计具有很高的成本效益,并且易于操作。使用标签来作为索引,而不是对全文进行检索&…

人工智能“排头兵”,探访福州多地 AI 智算实践

生成式 AI 在 2023 年再次引爆 IT 技术发展,福建作为数字中国的重要策源地,也是国家数字经济创新发展试验区,在人工智能方面拥有良好的产业基础和人才优势,同时近期出台的《福建省促进人工智能产业发展十条措施》,为福…

基于web的舞蹈选课管理系统设计与实现

基于web的舞蹈选课管理系统的设计与实现 摘 要 现如今,学生网上选课越来越便利,但是大多数在线下教育机构工作的教务人员,在进行教务管理的时候,并没有完全采用信息化管理。随着选择线下教育机构的人数不断增加,人工…

jQuery和JavaScript的区别

一、比较原生js和jQuery的区别 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title…

np.random.uniform() 采样得到的是一个高维立方体,而不是球体,为什么?

在代码中&#xff0c;采样是通过以下方式完成的&#xff1a; samples self.center np.random.uniform(-self.radius, self.radius, (num_samples, len(self.center))) 这里&#xff0c;np.random.uniform函数在每个维度独立地生成了一个介于-self.radius和self.radius之间的…

沉默是金,寡言为贵

​ 佛说&#xff1a;“人受一句话&#xff0c;佛受一柱香。”佛教的十善&#xff0c;其中有关口德就占了四样&#xff1a;恶口、妄语、两舌、绮语&#xff0c;可见口德是很重要的。言为心声&#xff0c;能说出真心的话&#xff0c;必然好听&#xff1b;假如说话言不由衷&#x…

Vue路由跳转页面刷新

案例使用映射路由 百度的时候各种操作就是没有注意keepAlive&#xff0c;发现那个为缓存开启之后前端有个小后台Vue生命周期函数失效。同一个页面刷新时这个keep Alive需要关闭。

热部署怎么部署

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言操作流程&#xff1a;在这里插入图片描述 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a832d83c091742eda9d9325931a89df4.png) 这里的跟上面的…

vue3+vite 批量引入局部组件及使用

目录结构 批量引入组件 例如&#xff1a;src/views/oss/components/customComponents.ts import { ref, defineAsyncComponent, markRaw } from vue;const modules import.meta.glob(./*.vue);//这告诉 TypeScript&#xff0c;components.value 是一个键为字符串、值为 define…

埃拉托色尼筛法

def is_prime(n):if n % 2 0 and n ! 2:return Falsefor i in range(3, int(math.sqrt(n) 1)):if n % i 0:return Falsereturn n ! 1def eratosthenes(n):primes []is_prime [True] * (n 1)for i in range(2, n1):if is_prime[i]:primes.append(i)# 用当前素数i去筛掉所有…

知乎禁止转载的回答怎么复制做笔记?

问题 对于“禁止转载”的回答&#xff0c;右键复制是不行的&#xff0c;ctrl-c也不行&#xff0c;粘贴之后都是当前回答的标题。稍微看了代码&#xff0c;应该是对copy事件进行了处理。不过这样真的有用吗&#xff0c;真是防君子不防小人&#xff0c;只是给收集资料增加了许多…

Spring Security 6.x 系列(7)—— 源码分析之建造者模式

一、建造者模式 WebSecurity、HttpSecurity、AuthenticationManagerBuilder 都是框架中的构建者&#xff0c;把他们放到一起看看他们的共同特点&#xff1a; 查看AuthenticationManagerBuilder的继承结构图&#xff1a; 查看HttpSecurity的继承结构图&#xff1a; 查看WebSec…

pycharm编译报错处理

1.c生成工具下载 https://visualstudio.microsoft.com/visual-cpp-build-tools/ 在这里插入图片描述 pip install pycocotools

浅谈用户体验测试的主要功能

用户体验(User Experience&#xff0c;简称UX)在现代软件和产品开发中变得愈发重要。为了确保产品能够满足用户期望&#xff0c;提高用户满意度&#xff0c;用户体验测试成为不可或缺的环节。本文将详细探讨用户体验测试的主要功能&#xff0c;以及它在产品开发过程中的重要性。…

激光雷达毫米波雷达

一.激光雷达 技术指标&#xff1a; 视场角 线数&#xff08;32/64/128&#xff09; 分辨率&#xff08;激光光束夹角越小分辨率越高&#xff0c;0.1度&#xff09; 探测距离&#xff1a;0.3-200m 反射率&#xff08;一般探测10%以上反射率的目标&#xff09; 分类 按照测距方…

pycharm 创建vue并实现简易路由功能

使用pycharm创建vue项目时&#xff0c;选择vite来创建vue。为什么使用vite&#xff1f;因为vite是专门针对vue开发的打包框架&#xff0c;以前使用vue-cli来创建vue项目&#xff0c;就是使用的webpack来进行打包的&#xff0c;现在有了vite&#xff0c;就尽量使用vite来创建vue…

进程--特征、五种基本状态、PCB、进程的创建与终止

一、进程的定义与特征 为了使参与并发执行的每个程序都能独立地允许&#xff0c;在操作系统中为程序配置一个专门的数据结构&#xff0c;称为进程控制块&#xff08;Process Control Block&#xff0c;PCB&#xff09;。系统利用PCB来描述进程的基本情况和活动过程&#xff0c…

VUE2+THREE.JS 模型上方显示信息框/标签(CSS3DSprite精灵模型)

THREE.JS 模型上方显示信息框/标签---CSS3DSprite精灵模型 1.CSS2DRenderer/CSS3DRenderer/Sprite的优劣2.实现模型上方显示信息框2.1 引入2.2 初始化加载的时候就执行此方法2.3 animate循环执行2.4 获取设备状态并在每个设备上显示设备状态2.5 样式 CSS3DSprite精灵模型面向摄…