Java基础枚举(enum关键字)

简介: 最近在回顾JavaSE部分的知识,对一些薄弱的知识进行记录,学习方式,通过视频和图书的进行学习,视频看B站韩顺平老师的30天学会Java,图书看Java核心技术 卷I 基础知识(原书第10版)。

个人推荐:

📢📢📢 前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下 "通俗易懂,风趣幽默",感觉非常有意思,忍不住分享一下给大家。 点击跳转到教程

在这里插入图片描述

前言

最近在回顾JavaSE部分的知识,对一些薄弱的知识进行记录,学习方式,通过视频和图书的进行学习,视频看B站韩顺平老师的30天学会Java,图书看Java核心技术 卷I 基础知识(原书第10版)。

韩顺平30天学会Java地址:https://www.bilibili.com/video/BV1fh411y7R8?p=425
在这里插入图片描述

一.枚举的简介

1.枚举的引出(自定义枚举)

需求:创建一个季节对象(Season),该对象包含季节名称和描述

package com.dudu.enumerone;

public 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;
    }
}


class Test{
    public static void main(String[] args) {
        Season spring = new Season("春天","温暖");
        Season winter = new Season("冬天", "寒冷");
        Season summer = new Season("夏天", "炎热");
        Season autumn = new Season("秋天", "凉爽");

    }

}

上面的代码是可以完成我们的需求,但是我们可以知道,季节对象是固定的(春夏秋冬),不会出现其他季节了,如果我们再增加一个Season对象,这时候就会打破这种固定的季节,显然这种方式并不完美!
在这里插入图片描述

进一步完善
分析Season对象的特点:

  • 季节的值是有限的几个值(spring,summer,autumn,winter)
  • 只读,不需要修改

根据上面的特点设计如下代码:

package com.dudu.enumerone;

public 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 SUMMER = new Season("夏天", "炎热");
    public static final Season AUTUMN = new Season("秋天", "凉爽");

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

    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

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

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

class Test{
    public static void main(String[] args) {
        System.out.println("季节:"+Season.SPRING.getName()+"描述:"+Season.SPRING.getDesc());
        System.out.println("季节:"+Season.WINTER.getName()+"描述:"+Season.WINTER.getDesc());
        System.out.println("季节:"+Season.SUMMER.getName()+"描述:"+Season.SUMMER.getDesc());
        System.out.println("季节:"+Season.AUTUMN.getName()+"描述:"+Season.AUTUMN.getDesc());

    }

}

运行效果:
在这里插入图片描述
注意:
(这里的不可修改表示的是无法改为指向其他对象,但其指向的对象本身是可以被修改的。)

final修饰的引用对象无法指向其他对象:
在这里插入图片描述
对象本身可以修改:
在这里插入图片描述
运行效果:
在这里插入图片描述

2.使用enum关键字

枚举(enumeration,简写enum),是一组常量集合,属于一种特殊的类,里面只包含一组有限的特定的对象。

在上面的代码中,Season类里面无非就是包含四组常量对象(spring,summer,autumn,winter),这非常符合枚举的定义,我们可以使用enum关键字来实现。

package com.dudu.enumerone;

public enum SeasonEnum {
    SPRING("春天","温暖"),
    SUMMER("夏天","炎热"),
    AUTUMN("秋天","凉爽"),
    WINTER("冬天","寒冷")
    ;

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

    private String name;
    private String 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;
    }
}


class  Test_Enum{
    public static void main(String[] args) {
        System.out.println("季节:"+SeasonEnum.SPRING.getName()+"描述:"+SeasonEnum.SPRING.getDesc());
        System.out.println("季节:"+SeasonEnum.WINTER.getName()+"描述:"+SeasonEnum.WINTER.getDesc());
        System.out.println("季节:"+SeasonEnum.SUMMER.getName()+"描述:"+SeasonEnum.SUMMER.getDesc());
        System.out.println("季节:"+SeasonEnum.AUTUMN.getName()+"描述:"+SeasonEnum.AUTUMN.getDesc());
    }
}

运行效果:
在这里插入图片描述

我们会发现SeasonEnum(使用enum关键字)和上面设计的Season类非常相识,只有二处不同:

  • Season使用的是Class关键字是一个类,而SeasonEnum使用的是enum关键字

在这里插入图片描述

  • SeasonEnum中的常量对象类似于Season的简写方式

在这里插入图片描述

其实Season类这种方式也是实现枚举的一种方式,即自定义枚举类型。
Season类反编译原码:
在这里插入图片描述
SeasonEnum反编译源码(enum关键字本质上还是一个类(class),只是该类会继承Enum抽象类):
在这里插入图片描述

3.注意事项(enum关键字实现枚举)

  • 当我们使用enum关键字开发一个枚举类时,默认会继承Enum类,而且是一个final类
  • 传统的( public static final Season SPRING = new Season("春天","温暖");)这种方式简化成 SPRING("春天","温暖"), ,这里必须知道,它调用的是那个构造器
  • 如果使用无参构造器创建枚举对象,则实参列表和小括号都可以省略
  • 当有多个枚举对象时,使用 , 间隔,最后有一个分号结尾 ;
  • 枚举对象必须放在枚举的行首

如果使用无参构造器创建枚举对象,则实参列表和小括号都可以省略:
在这里插入图片描述
枚举对象必须放在枚举的行首:
在这里插入图片描述

二.枚举的使用

需求,使用无参构造器,创建一个颜色(Color)枚举,包含三个常量(RED,GREEN,YELLOW)

代码如下:

package com.dudu.enumerone;

public enum Color {
    RED,
    GREEN,
    YELLOW
    ;
}


class  Test_ColorEnum{
    public static void main(String[] args) {
        Color color = Color.RED;
        Color color1 = Color.RED;
        System.out.println(color);
        System.out.println(color == color1);
    }
}

运行效果:
在这里插入图片描述

  • 第一个输出 RED 是Color通过调用父类Enum类的toString()方法返回的name(这里的name就是RED)

在这里插入图片描述

  • 第二个输出返回 true,这是因为RED是一个Static的静态常量,作用在类上(地址和值都相同),color和color1指向的是同一个地址

在这里插入图片描述

三.枚举常用方法

说明:使用关键字enum时,会隐式继承Enum类,这样我们就可以使用Enum类相关的方法。
在这里插入图片描述

package com.dudu.enumerone;

public class EnumMethod {
    public static void main(String[] args) {
        // name():返回枚举对象的名字
        System.out.println(SeasonEnum.AUTUMN.name());
        // ordinal():返回枚举对象的次序(从0开始编号)
        System.out.println(SeasonEnum.AUTUMN.ordinal());

        // values():返回定义的所有枚举对象
        SeasonEnum[] seasonEnums =  SeasonEnum.values();
        for (SeasonEnum seasonEnum:seasonEnums){
            System.out.println(seasonEnum);
        }
        // valueOf():将字符串转换成枚举对象,要求该字符串必须为已有的常量名,否则会报错
        SeasonEnum seasonEnum = SeasonEnum.valueOf("SPRING");
        System.out.println(seasonEnum.getName());

        // compareTo():比较二个枚举常量,比较的是编号(前一个的编号减后一个的编号) self.ordinal - other.ordinal
        System.out.println("SPRING的编号为"+SeasonEnum.SPRING.ordinal());
        System.out.println("AUTUMN的编号为"+SeasonEnum.AUTUMN.ordinal());
        System.out.println("SPRING的编号 - AUTUMN的编号为"+(SeasonEnum.SPRING.ordinal()-SeasonEnum.AUTUMN.ordinal()));
        System.out.println("SPRING和AUTUMN比较的编号为"+SeasonEnum.SPRING.compareTo(SeasonEnum.AUTUMN));
    }
}

运行效果:
在这里插入图片描述

四.枚举使用细节

  • 使用enum关键字后,就不能再继承其它类,因为enum会隐式继承Enum,而Java是单继承机制。
  • 枚举类和普通类一样,可以实现接口,如: enum 类名 implements 接口1,接口2{}

使用enum关键字后,就不能再继承其它类:
在这里插入图片描述

枚举类和普通类一样,可以实现接口:
在这里插入图片描述

运行效果:
在这里插入图片描述

相关文章
|
6天前
|
缓存 安全 Java
Volatile关键字与Java原子性的迷宫之旅
通过合理使用 `volatile`和原子操作,可以在提升程序性能的同时,确保程序的正确性和线程安全性。希望本文能帮助您更好地理解和应用这些并发编程中的关键概念。
35 21
|
2月前
|
Java 编译器 开发者
Java中的this关键字详解:深入理解与应用
本文深入解析了Java中`this`关键字的多种用法
160 9
|
3月前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
Java 并发编程——volatile 关键字解析
|
2月前
|
JSON Java 数据挖掘
利用 Java 代码获取淘宝关键字 API 接口
在数字化商业时代,精准把握市场动态与消费者需求是企业成功的关键。淘宝作为中国最大的电商平台之一,其海量数据中蕴含丰富的商业洞察。本文介绍如何通过Java代码高效、合规地获取淘宝关键字API接口数据,帮助商家优化产品布局、制定营销策略。主要内容包括: 1. **淘宝关键字API的价值**:洞察用户需求、优化产品标题与详情、制定营销策略。 2. **获取API接口的步骤**:注册账号、申请权限、搭建Java开发环境、编写调用代码、解析响应数据。 3. **注意事项**:遵守法律法规与平台规则,处理API调用限制。 通过这些步骤,商家可以在激烈的市场竞争中脱颖而出。
|
4月前
|
安全 Java 测试技术
🎉Java零基础:全面解析枚举的强大功能
【10月更文挑战第19天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
151 60
|
3月前
|
缓存 安全 Java
Java volatile关键字:你真的懂了吗?
`volatile` 是 Java 中的轻量级同步机制,主要用于保证多线程环境下共享变量的可见性和防止指令重排。它确保一个线程对 `volatile` 变量的修改能立即被其他线程看到,但不能保证原子性。典型应用场景包括状态标记、双重检查锁定和安全发布对象等。`volatile` 适用于布尔型、字节型等简单类型及引用类型,不适用于 `long` 和 `double` 类型。与 `synchronized` 不同,`volatile` 不提供互斥性,因此在需要互斥的场景下不能替代 `synchronized`。
2349 3
|
4月前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
77 24
|
4月前
|
JavaScript 前端开发 Java
java中的this关键字
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。自学前端2年半,正向全栈进发。若我的文章对你有帮助,欢迎关注,持续更新中!🎉🎉🎉
75 9
|
4月前
|
设计模式 JavaScript 前端开发
java中的static关键字
欢迎来到瑞雨溪的博客,博主是一名热爱JavaScript和Vue的大一学生,致力于全栈开发。如果你从我的文章中受益,欢迎关注我,将持续分享更多优质内容。你的支持是我前进的动力!🎉🎉🎉
71 8
|
4月前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
67 4

热门文章

最新文章