> 文档中心 > 【JavaSE】十二生肖带你走进枚举类

【JavaSE】十二生肖带你走进枚举类

💁 个人主页:Nezuko627的博客主页
❤️ 支持我:👍 点赞 🌷 收藏 🤘关注
🎏 格言:立志做一个有思想的程序员 🌟
📫 作者介绍:本人本科软件工程在读,博客将主要分享JavaSE、JavaEE、MySQL、SpringBoot、算法等知识。专栏内容长期更新,如有错误,欢迎评论区或者私信指正!感谢大家的支持~~~

本篇学习目标:

  • ⭐️ 掌握自定义类实现枚举的方法;
  • ⭐️ 了解为什么需要枚举类;
  • ⭐️ 掌握枚举类的基本使用;
  • ⭐️ 熟悉枚举类的常用方法;
  • ⭐️ 注意枚举类的使用细节;

本文来自专栏:JavaSE系列专题知识及项目 欢迎点击支持订阅专栏 ❤️
在这里插入图片描述

文章目录

  • 1.枚举类引入
  • 2 自定义类实现枚举
    • 2.1 自定义类实现枚举的步骤与特点
    • 2.2 按照步骤实现自定义类
  • 3 enum关键字实现枚举
    • 3.1 enum枚举类实现步骤
    • 3.2 使用enum关键字解决需求
    • 3.3 使用enum枚举类的注意事项
  • 4 enum常用方法及基本使用
    • 4.1 toString() 与 name()
    • 4.2 oridinal()
    • 4.3 values() 与 valueOf()
  • 5 练习*
  • 写在最后

1.枚举类引入

先来看一个需求:

要求创建(Animal)对象,请设计并完成该 Animal 类的基本信息属性,以及构造器与get方法,并在测试中输出十二生肖的信息。

在这里插入图片描述

需求很简单,我们只需要按照要求创建类,在测试类中创建对象即可,参考代码如下:

public class Main {    public static void main(String[] args) { // 创建十二生肖 Animal rat = new Animal("子鼠"); Animal ox = new Animal("丑牛"); Animal tiger = new Animal("寅虎"); Animal rabbit = new Animal("卯兔"); Animal dragon = new Animal("辰龙"); Animal snake = new Animal("巳蛇"); Animal horse = new Animal("午马"); Animal sheep = new Animal("未羊"); Animal monkey = new Animal("申猴"); Animal rooster = new Animal("酉鸡"); Animal dog = new Animal("戌狗"); Animal pig = new Animal("亥猪"); // 打印信息 System.out.println(rat.getName()); System.out.println(ox.getName()); System.out.println(tiger.getName()); System.out.println(rabbit.getName()); System.out.println(dragon.getName()); System.out.println(snake.getName()); System.out.println(horse.getName()); System.out.println(sheep.getName()); System.out.println(monkey.getName()); System.out.println(rooster.getName()); System.out.println(dog.getName()); System.out.println(pig.getName());    }}/** * Animal类 */class Animal{    private String name;  // 十二生肖姓名    // 构造器    public Animal(String name) { this.name = name;    }    // getXxx    public String getName() { return name;    }}

分析代码发现,虽然需求我们成功的解决了,但是,对于十二生肖而言,它的对象(具体值),是固定的12个,不会再多。而当前设计类的思路,并不能体现十二生肖是固定的12个对象, 我们需要将需求添加如下限制:

1.十二生肖的值是有限的12个(rat、ox、tiger… …);
2.对象只读,不需要修改。

为了解决该需求,我们引出枚举的概念: 枚举是一组常量的集合,可以理解成,枚举是一种特殊的类,里面只包含一组有限的特定对象。
而枚举,我们通常有两种实现方式:(1)自定义枚举类实现;(2)使用 enum 关键字实现枚举。下面我们来分别通过(1)(2)两种方式实现十二生肖的需求。


2 自定义类实现枚举

2.1 自定义类实现枚举的步骤与特点

1️⃣ 不需要提供 setXxx 方法,因为 枚举类的对象值通常为只读;
2️⃣ 对枚举对象/属性使用 final + static 修饰,实现底层优化;
3️⃣ 枚举类对象名通常大写,这是常量的命名规范;
4️⃣ 将自定义类的构造器私有化,防止外部 new 新对象;
5️⃣ 在自定义类中创建一组对象,并对外暴露对象,即使用 final + static 修饰,让外部可以通过 类名.对象名 的方式直接访问到枚举对象。

2.2 按照步骤实现自定义类

🍑 自定义类参考代码:
在这里插入图片描述
🍌 测试代码如下:
在这里插入图片描述
🍎 测试结果:

Animal{name=‘子鼠’}
Animal{name=‘丑牛’}
Animal{name=‘寅虎’}
Animal{name=‘卯兔’}
Animal{name=‘辰龙’}
Animal{name=‘巳蛇’}
Animal{name=‘午马’}
Animal{name=‘未羊’}
Animal{name=‘申猴’}
Animal{name=‘酉鸡’}
Animal{name=‘戌狗’}
Animal{name=‘亥猪’}


3 enum关键字实现枚举

3.1 enum枚举类实现步骤

1️⃣ 使用 enum 关键字替代 class
2️⃣ 相较于自定义枚举类,我们不需要再使用 public static final 修饰对象,只需要使用 对象常量名(实参列表) 的方式就行,如果是使用默认无参构造器,则可以省略小括号及实参列表;

在上面的例子中,public static final Animal RAT = new Animal("子鼠") 可以直接使用 Rat("子鼠") 来代替

3️⃣ 如果有多个常量(对象),则以分隔, 最后一个常量后加分号;
4️⃣ 需要特别注意的是,使用 enum 实现枚举类,要将定义的常量对象,写在类的前面。

3.2 使用enum关键字解决需求

在这里,其实只需要将自定义类稍加修改就行(博主在偷懒,不要效仿嗷,手动狗头.jpg)。高情商:我们使用 enum 来优化代码~
Tips:在 idea 中 alt + shift + a 可以实现多光标同时修改,按 esc 退出。
[视频演示]

Idea多光标编辑演示

🍑 枚举类参考代码:
在这里插入图片描述
测试类代码不需要作出改动,控制台测试结果如下:

Animal{name=‘子鼠’}
Animal{name=‘丑牛’}
Animal{name=‘寅虎’}
Animal{name=‘卯兔’}
Animal{name=‘辰龙’}
Animal{name=‘巳蛇’}
Animal{name=‘午马’}
Animal{name=‘未羊’}
Animal{name=‘申猴’}
Animal{name=‘酉鸡’}
Animal{name=‘戌狗’}
Animal{name=‘亥猪’}

3.3 使用enum枚举类的注意事项

1️⃣ 当使用 enum 关键字创建一个枚举类时,会 默认继承 Enum类;
在这里插入图片描述

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

enum 类名 implents 接口1,接口2… …{ }

🍌 示例代码:

public class Main {    public static void main(String[] args) { Animal.Bird.speak();    }}/** * 接口 */interface Say{    void speak();}/** * Animal类 */enum Animal implements Say{    Bird;    @Override    public void speak() { System.out.println("动物叫~~~");    }}

🍎 运行结果:

动物叫~~~

3️⃣ 使用 enum 关键字后,类似上面所讲的自定义枚举类,即构造方法被私有化,同样无法创建对象。


4 enum常用方法及基本使用

🚗 enum常用方法一览表:

方法名 详细描述
valueOf() 传递枚举类型的Class对象和枚举常量名称给静态方法valueOf,会得到与参数匹配的枚举常量
toString() 得到当前枚举常量的名称。你可以通过重写该方法使得到的结果更易读
equals() 在枚举类型中可以直接使用 == 来比较两个枚举常量是否相等。Enum提供的该方法也是直接使用 == 来判断的。它的存在是为了在 Set 、 List 和 Map 中使用。equals() 是不可变的
hashCode() 与equals()保持一致,也是不可变的
getDeclaringClass() 得到枚举常量所属的枚举类型的Class对象。用于判断两个枚举常量是否属于同一枚举类型
name() 得到当前枚举常量的名称
ordinal() 得到当前枚举常量的次序,与数组索引类似,从0开始
comparaTo() 可以比较两个枚举常量的大小(按照声明的顺序排列)
clone() 枚举类型不能被Clone。为了防止子类实现克隆方法,Enum实现了一个仅抛出CloneNotSupportedException异常的不变Clone()方法

4.1 toString() 与 name()

  1. toString() 方法 Enum类已经重写过了,返回当前对象名;
  2. name() 方法返回当前对象名,子类不能重写;

🐦 示例代码及结果:
在这里插入图片描述

4.2 oridinal()

返回当前对象的序号,和声明顺序有关,索引默认从0开始。
🐦 示例代码及结果:
在这里插入图片描述

4.3 values() 与 valueOf()

  1. values() 返回当前枚举类的所有常量(以枚举类数组的形式);
  2. valueOf() 将字符串转成枚举对象,要求字符串必须为已有常量名,否则抛出异常。

🐦 示例代码及结果:

public class Main {    public static void main(String[] args) { System.out.println("============== values ================="); Animal[] animals = Animal.values();  // 接收常量 for (Animal animal: animals) {     System.out.print(animal + " ");  // 默认调用toString输出对象名 } System.out.println("\n============== valueOf ================="); Animal rabbit = Animal.valueOf("RABBIT");  // 在枚举类寻找对象名为RABBIT的对象,引用赋给mouse System.out.println(rabbit);  // RABBIT    }}/** * Animal类 */enum Animal {    // 在enum创建对象,并对外暴露   RAT("子鼠"), OX("丑牛"), TIGER("寅虎"), RABBIT("卯兔"),    DRAGON("辰龙"), SNAKE("巳蛇"), HORSE("午马"), SHEEP("未羊"),    MONKEY("申猴"), ROOSTER("酉鸡"), DOG("戌狗"), PIG("亥猪");    private String name;  // 十二生肖姓名    // 构造器私有化    private Animal(String name) { this.name = name;    }}

============== values =================
RAT OX TIGER RABBIT DRAGON SNAKE HORSE SHEEP MONKEY ROOSTER DOG PIG
============== valueOf =================
RABBIT


5 练习*

声明 Week枚举类,其中包含星期一到星期日的定义。请你完成枚举类的编写,并在测试类遍历输出信息,形式如下图:
【JavaSE】十二生肖带你走进枚举类

🐦 参考答案:

public class Test {    public static void main(String[] args) { Week[] days = Week.values(); for (Week day :  days) {     System.out.println(day); }    }}enum Week{    MONDAY("星期一"),TUESDAY("星期二"),    WEDNESDAY("星期三"),THURSDAY("星期四"),    FRIDAY("星期五"),SATURDAY("星期六"),    SUNDAY("星期日");    private String desc;    private Week(String desc){ this.desc = desc;    }    @Override    public String toString() { return this.desc;    }}

写在最后

🌟以上便是本文的全部内容啦,后续内容将会持续免费更新,如果文章对你有所帮助,麻烦动动小手点个赞 + 关注,非常感谢 ❤️ ❤️ ❤️ !
如果有问题,欢迎私信或者评论区!
在这里插入图片描述

共勉:“你间歇性的努力和蒙混过日子,都是对之前努力的清零。”
在这里插入图片描述