当前位置: 首页 > news >正文

【Java中级】11章、枚举 - java引用数据类型,枚举介绍、快速入门,了解枚举类的基本使用方式【1】

文章内容:

  • 自定义实现枚举
  • enum关键字实现枚举

❤️内容涉及枚举的定义,快速入门,注意事项和小题巩固知识点
🌈 跟着B站一位老师学习的内部类内容,现写这篇文章为学习内部类的小伙伴提供思路支持,希望可以一起感受java的魅力,爱上java编程!!!


1、枚举

1.1介绍

1.1.1、介绍

枚举类【枚:一个一个 举:即把具体的对象一个一个列举出来的类就称为枚举类】

  1. 枚举对应英文(enumeration,简写:enum)
  2. 枚举是一组常量的集合[春、夏、秋、冬]
  3. 可以这里理解:枚举属于一种特殊的类,里面只包含一组有限的特定对象
  • final + static不会导致类加载
  1. 不需要提供setXxx方法,因为枚举对象值通常为只读。
  2. 对每枚举 对象/属性 使用 final + static 共同修饰,实现底层优化。
  3. 枚举对象名通常使用全部大写**,常量的命名规范。**
  4. 枚举对象根据需要,也可以有多个属性
    枚举示例(未使用enum形式):
    在这里插入图片描述
    (此时的构造器使用private修饰,所以不能使用new的方法进行类的初始化,只能使用类名.静态属性/方法)
    代码演示:
package com.fhsedu.enum_;
public class Enumeration02 {
    public static void main(String[] args) {
		//运行结果见下图
        System.out.println(Season.SPRING);
        System.out.println(Season.AUTUMN);
        System.out.println(Season.SUMMER);
        System.out.println(Season.WINTER);
    }
}
class Season{
    private String name;
    private String desc;
    public final static Season SPRING = new Season("春天","温暖");
    public final static Season SUMMER = new Season("夏天","炎热");
    public final static Season AUTUMN = new Season("秋天","凉爽");
    public final static Season WINTER = 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.1.2、enum关键字实现枚举

很多情况下,枚举类是不希望进行更改的,但是可以进行获取内容,所以枚举类中只有getXxx方法,没有setXxx方法

enum关键字实现枚举,快速入门
语法:
在这里插入图片描述

体会和自定义枚举的区别

  • 使用普通方法
    public final static Season SPRING = new Season("春天","温暖");
    public final static Season SUMMER = new Season("夏天","炎热");
    public final static Season AUTUMN = new Season("秋天","凉爽");
    public final static Season WINTER = new Season("冬天","寒冷");
  • 使用枚举方法(有多个枚举使用逗号分隔(,)最后使用分号结尾(;))
  SPRING("春天","温暖"), SUMMER("夏天","炎热"), 
  AUTUMN("秋天","凉爽"), WINTER("冬天","寒冷");

枚举演示

enum Season03{
    //如果使用了enum 代替class
    //2、public static final Season SPRING =
    //  new SPRING("春天","温暖");解读 常量名(实参列表)
    //3、如果有多个常量(对象) 使用   ,   号间隔即可
    //4、如果使用enum 来实现枚举,要求将定义常量对象,写在前面
    SPRING("春天","温暖"), SUMMER("夏天","炎热"),
     AUTUMN("秋天","凉爽"), WINTER("冬天","寒冷");
    private String name;
    private String desc;//描述

    Season03(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 "Season03{" +
        "name='" + name + '\'' +
        ", desc='" + desc + '\'' +
        '}';
    }
}

1.2、快速入门

  • 如果我们使用的是无参构造器,创建常量对象则可以省略()
SPRING("春天","温暖"), 
SUMMER("夏天","炎热"), 
AUTUMN("秋天","凉爽"),
WINTER("冬天","寒冷"),WHAT;
private String name;
private String desc;//描述

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

1.3、enum注意事项

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

1.4、enum判断是否可行

判断下面的代码是否正确,并说明其含义
在这里插入图片描述

解答:

  1. 上面的语法是可以的
  2. 有一个枚举类Gender,没有属性
  3. 有两个枚举对象 BOY,GIRL,使用的无参构造器创建

下列代码输出的内容是什么?
在这里插入图片描述

enum的修饰为:public final static ....

package com.fhsedu.enum_;

/**
 * @author fhs
 * @version 1.0
 */
public class EnumerationExercise01 {
    public static void main(String[] args) {
        Gender2 boy = Gender2.BOY;//OK
        Gender2 boy2 = Gender2.BOY;//OK
        System.out.println(boy);//BOY
        /*public String toString() {
            return name;
        }*/
        System.out.println(boy == boy2);//public final static
    }
}
enum Gender2{
    BOY,GIRL;
}

Enum中底层源代码:


1.5、Enum常用方法

了解Enum的一般常用方法

代码演示

package com.fhsedu;
@SuppressWarnings("all")
public class EnumDemo01 {
    public static void main(String[] args) {
        Season spring = Season.SPRING;
        System.out.println(spring);//SPRING
        System.out.println(spring.name());//SPRING
        System.out.println(spring.ordinal());//0
        Season[] values = Season.values();//枚举中的所有类型
        for (Season season : values) {
            //SPRING
            //SUMMER
            System.out.println(season);
        }
        Season summerValue = Season.valueOf("SUMMER");
        System.out.println(summerValue);//SUMMER
        System.out.println(spring.compareTo(summerValue));//-1    (spring的位置号 - summerValue的位置号)
    }
}

enum Season {
    SPRING("春天", "温暖"),
    SUMMER("夏天", "炎热");

    private String name;

    private String describe;

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

    public String getName() {
        return name;
    }

    public String getDescribe() {
        return describe;
    }
}


对象.ordinal() —>输出对象的序号/编号

  • valuesOf用法
//执行流程
//1、根据你输入的 "SPRING" 到  Season03的枚举对象去查找
//2、如果找到了,就返回,如果没有找到,就报错
Season03 spring1 = Season03.valueOf("SPRING");
System.out.println("spring = " + spring1);//对象信息
System.out.println(spring == spring1);//true

如果valueOf(“SPRING”)该对象中没有该信息,就会报错:

没有一个枚举常量

  • CompareTo
System.out.println("====compareTo====");
//compareTo:比较两个枚举常量,比较的就是编号
//1、就是把  Season2.AUTUMN  枚举对象的编号和Season03.AUTUMN枚举对象的编号进行比较
//2、看看结果
/*
*  public final int compareTo(E o) {
return self.ordinal - other.ordinal;
    }
    * Season03.SPRING的编号[0] - Season03.AUTUMN[2]的编号
    * */

System.out.println(Season03.SPRING.compareTo(Season03.AUTUMN));//-2

所有方法:

package com.fhsedu.enum_;

/**
 * @author fhs
 * @version 1.0
 */
public class EnumMethod {
    public static void main(String[] args) {
        //使用Season03  枚举类,来演示各种方法
        Season03 spring = Season03.SPRING;
        //输出枚举对象的名字
        System.out.println(spring.getName());//春天
        //ordinal()  输出的是该枚举对象的次序/编号 ,从0开始
        //SPRING 枚举对象是第一个,因此输出0
        System.out.println(spring.ordinal());//0
        //从反编译可以看出  values  方法  返回Season03[]
        //含有定义的所有枚举对象
        System.out.println(spring.values());


        System.out.println("====valuesOf====");
        //valueOf:将字符串转换成枚举对象,要求字符串必须为己有的常量名,否则会报异常
        //执行流程
        //1、根据你输入的 "SPRING" 到  Season03的枚举对象去查找
        //2、如果找到了,就返回,如果没有找到,就报错
        Season03 spring1 = Season03.valueOf("SPRING");
        //Season03中找不到就会报错
        //        Season03 season031 = Season03.valueOf("FHS");
        System.out.println("spring = " + spring1);//对象信息
        System.out.println(spring == spring1);//true

        System.out.println("====compareTo====");
        //compareTo:比较两个枚举常量,比较的就是编号
        //1、就是把  Season2.AUTUMN  枚举对象的编号和Season03.AUTUMN枚举对象的编号进行比较
        //2、看看结果
        /*
        *  public final int compareTo(E o) {
        return self.ordinal - other.ordinal;
            }
            * Season03.SPRING的编号[0] - Season03.AUTUMN[2]的编号
            * */

        System.out.println(Season03.SPRING.compareTo(Season03.AUTUMN));//-2

        Season03[] season03s = Season03.values();

        System.out.println("----遍历取出枚举对象(增强for)----");
        for (Season03 season03 : season03s) {//增强for循循环
            System.out.println(season03);
        }
        /*for (Season03 season03 : season03s) {//快捷键  season03.for
        }*/

    }
}

1.6、enum实现星期打印

package com.fhsedu.enum_;

public class EnumExercise01 {
    public static void main(String[] args) {
        //获取所有的枚举内容
        Week[] weeks = Week.values();
        System.out.println("====所有星期的信息如下====");
        for (Week week : weeks) {
            //将所有的枚举信息输出出来
            System.out.println(week.getDay());
        }
    }
}

enum Week {
    //定义Week的枚举对象
    MONDAY("星期一"),
    TUESDAY("星期二"),
    WEDNESDAY("星期三"),
    THURSDAY("星期四"),
    FRIDAY("星期五"),
    SATURDAY("星期六"),
    SUNDAY("星期日");

    private String day;

    private Week(String day) {
        this.day = day;
    }

    public String getDay() {
        return day;
    }
}

在这里插入图片描述

1.7、enum实现接口

  • enum不能继承其他类

  1. 使用enum关键字后,就不能再继承其他类了,因为enum会隐式继承Enum,而java是单继承机制
  2. 枚举类和普通类一样,可以实现接口,如下形式:

enum 类名 implements 接口1,接口2{}

package com.fhsedu.enum_;

/**
 * @author fhs
 * @version 1.0
 */
public class EnumDetail {
    public static void main(String[] args) {
        Music.CLASSMUSIC.playing();
    }
}
//1、enum实现的枚举类,仍然是一个类,所以还是可以实现接口的
interface IPlaying {
    public void playing();
}
//2、enum本身继承了Enum类,所以不能继承其他类了
enum Music implements IPlaying {
    CLASSMUSIC();
    @Override
    public void playing() {
        System.out.println("播放好听的音乐....");
    }
}

相关文章:

  • 基于webGis绘制点、面
  • Python标准库os模块完全指南
  • 安装node.js
  • 1.6-抓包技术(Burp Suite\Yakit抓包\Web、APP、小程序)
  • 蓝桥杯2022年第十三届省赛真题-统计子矩阵
  • ruby基础语法
  • shell脚本 - Linux定时温度监控-软硬件检测 - 服务器温度监控 - 写入日志
  • [Linux]从零开始的ARM Linux交叉编译与.so文件链接教程
  • nginx路径匹配的优先级
  • 条件概率、概率乘法公式、全概率公式和贝叶斯 (Bayes) 公式
  • phpstrom 配置调试 php 项目全流程,弄清一些概念
  • vue项目本地调试使用https
  • 软考案例分析实例答题模板
  • CS内网渗透 - 如何通过冰蝎 Webshell 上线 Weblogic 服务器到 Cobalt Strike 并绕过杀软检测(360、火绒)?
  • 8.2 对话框2
  • 【硬核实战】从零打造智能五子棋AI:JavaScript实现与算法深度解析
  • SpringBoot 基于个性化定制的智慧校园管理系统设计与开发
  • 大模型学习六:‌小米8闲置,通过Termux安装ubuntu做个随身服务器,纯粹碍眼折腾
  • 【MCP-1】MCP是什么,从DEMO入手
  • 从零构建大语言模型全栈开发指南:第五部分:行业应用与前沿探索-5.2.2超级对齐与AGI路径探讨
  • 最高人民法院原副院长唐德华逝世,享年89岁
  • 佩斯科夫:俄方代表团15日将在伊斯坦布尔等候乌克兰代表团
  • 西北大学副校长成陕西首富?旗下巨子生物去年净利超20亿,到底持股多少
  • 北京航空航天大学首个海外创新研究院落户巴西
  • 专访|导演刘江:给谍战题材注入现实主义的魂
  • 在对国宝的探索中,让美育浸润小学校园与家庭