【JavaSE】枚举类——规范的类

简介: 走进枚举类

前言

《北史·恩幸传序》:"其间盗官卖爵,污辱宫闱者多矣,亦何可 枚举哉。" 从词中不难看出,所谓的枚举就是一
一列举出来,枚举拥有很明显的一个特征,我列举出来的对象已经具有了某种属性,枚举的结果是令别人观察的一种方式,即所谓的 只读性
在面向对象过程中不断强调简化,高效的特性,但枚举类在以往类的基础上更像是一种规范类

枚举

一.自定义类实现枚举

单从Java类的层面来看,我想要枚举出的东西都是一个一个具有特定属性的对象实例,在创建对象的类中我需要给予他们成员属性,并且通过构造器初始化对象
下面从一个简单的例子具体阐述用自定义类实现枚举——列举出四季以及特征 例如:
public class Enumeration01 {
    public static void main(String[] args) {
        System.out.println(Season.AUTUNN);
        System.out.println(Season.SPRING);
        System.out.println(Season.WINTER);
        System.out.println(Season.SUMMER);
    }
class Season{
    private String type; //季节
    private String desc; //特征
    public static Season SPRING = new Season("春天","温暖");
    public static Season WINTER = new Season("冬天","寒冷");
    public static Season AUTUNN = new Season("秋天","凉爽");
    public static Season SUMMER = new Season("夏天","炎热");
    private Season(String type, String desc) {
        this.type = type;
        this.desc = desc;
    }
    public String getType() {
        return type;
    }
    public String getDesc() {
        return desc;
    }
    @Override
    public String toString() {
        return type + desc;
    }
}

==注意:枚举对象通常使用全部大写==

从上述方式可以看出:
以往在主函数新建对象调用成员的方式已经一去不复返了,取而代之的是把new出来的一组不同对象写在了一个类里,这样我们就可以直接在主函数调用对象就行,而==不需要重新new==。
这样做的好处已经充分体现: 一年只有四季,我不可能枚举出来不存在的季节,因为我已经在Season类中规范了
我把构造器私有化,这就只允许我在本类初始化对象 只提供get()方法不提供set()方法,显然是只让你拿不让你改 这些就体现了只读性

二.enum关键字实现枚举

在自定义类枚举的基础上,利用enum关键字实现枚举其实就是一个简化的过程
1.使用关键字==enum替代 class==
2.public static final Season SPRING = new Season("春天","温暖") 等价于SPRING("春天","温暖")常量名(实参列表)
3.==同样私有化构造器的目的是为了不在外部new==体现规范性
4.如果有多个常量(对象),使用,号间隔即可

例如:

public class Enumeration02 {
    public static void main(String[] args) {
        System.out.println(Season2.SUNMER);
        System.out.println(Season2.AUTUIN);
        System.out.println(Season2.WINTER);
        System.out.println(Season2.SPRING);
    }
}
//使用enum关键字实现枚举
enum Season2{
    SPRING("春天","温暖"),WINTER("冬天","寒冷"),AUTUIN("秋天","凉爽"),SUNMER("夏天","炎热");
    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   name + desc ;
    }
}

从上述可以看出,整个程序代码中没有出现一个new,大家可以想一下为什么?

三.枚举实现原理

我们都知道,我们写出来的enum是Java源代码的一部分,而在源代码通过编译器编译的过程中,当读到enum这个关键字时,编译器会为我们创建一个枚举类,这个类有一个特性,那就是继承了Java.lang中的Enum类,因此也得到了很多新的功能,从源码中不难看出:

==正因java单继承机制的原因所以枚举类不可以继承别的类==
在这里插入图片描述
==个人理解==:之所以和自定义实现枚举类不同是因为enum类继承了Enum类,源代码经过编译过程中重写了很多我们看不见的方法,而这些操作都是编译器在为我们默默背负
目前水平有限,仅是个人见解供大家参考~

四.枚举类与接口

enum类并不能再继承其它类,但并不妨碍它实现接口,因此enum类同样是可以实现多接口的

例如:

public class Main {
    public static void main(String[] args) {
        Person.Boy.play();
    }
}
interface Way{
    void play();
}
enum Person implements Way{
    Boy();
    @Override
    public void play() {
        System.out.println("玩一下吧,别学了");
    }
}

五.枚举类与switch

==这也是一种新的枚举形式==
利用switch语句来判断枚举对象所对应人为规定的类型是什么

enum Person{
    BOY,GIRL,PERSON;
}
 class EG{
    public void type(Person person) {
        switch (person) {
            case BOY:
                System.out.println("男孩");
                break;
            case GIRL:
                System.out.println("女孩");
                break;
            case PERSON:
                System.out.println("人");
                break;
        }
   }
    public static void main(String[] args){
        type(Person.BOY);
        type(Person.GIRL);
        type(Person.PERSON);
    }
 }

▶️运行结果:

男孩
女孩
人

六.进阶用法values() valueOf()

values()方法的作用就是获取枚举类中的所有变量,并==作为数组返回==,而valueOf(String
name)方法与Enum类中的valueOf方法的作用类似,valueOf() 将输入的字符串转成枚举对象,要求==字符串必须为已有常量名==

例如:

public class Enumeration02 {
    public static void main(String[] args) {
    System.out.println("----------values----------");
        Season[] season = Season.values(); //values
        for (Season season1 : season) {
            System.out.println(season1);
        }
        System.out.println("----------valueOf----------");
        Season spring = Season.valueOf("SPRING");  //values of
        System.out.println(spring);
    }
}
//使用enum关键字实现枚举
enum Season {
    SPRING("春天", "温暖"), WINTER("冬天", "寒冷"), 
    AUTUIN("秋天", "凉爽"), SUNMER("夏天", "炎热");
    private String name;
    private String desc;
    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 name + desc;
    }
}

▶️运行结果:
在这里插入图片描述
在这里插入图片描述

相关文章
|
5月前
|
存储 Java 编译器
JavaSE基础:类和接口
JavaSE基础:类和接口
|
7月前
|
安全 Java
Java一分钟之-访问修饰符与封装原则
【5月更文挑战第9天】本文介绍了Java中的访问修饰符(public, protected, default, private)及其在封装原则中的应用。理解这些修饰符有助于控制类、接口、方法和变量的访问权限,防止过度暴露内部细节。遵循最小权限原则,合理设计接口,并谨慎使用protected,能有效避免常见问题,提高代码的健壮性和安全性。封装是关键,通过使用private修饰成员变量并提供公共访问方式,可减少耦合,增强系统的可维护性。
74 0
|
7月前
|
Java API
Java基础—笔记—内部类、枚举、泛型篇
本文介绍了Java编程中的内部类、枚举和泛型概念。匿名内部类用于简化类的创建,常作为方法参数,其原理是生成一个隐含的子类。枚举用于表示有限的固定数量的值,常用于系统配置或switch语句中。泛型则用来在编译时增强类型安全性,接收特定数据类型,包括泛型类、泛型接口和泛型方法。
30 0
|
7月前
|
Java
JavaSE基础篇:枚举
JavaSE基础篇:枚举
|
7月前
|
存储 Java 编译器
JavaSE学习之--抽象类,接口,内部类(三)
JavaSE学习之--抽象类,接口,内部类(三)
41 0
|
7月前
|
Java
JavaSE学习之--抽象类,接口,内部类(一)
JavaSE学习之--抽象类,接口,内部类(一)
90 0
|
7月前
|
存储 Java 机器人
JavaSE学习之--抽象类,接口,内部类(二)
JavaSE学习之--抽象类,接口,内部类(二)
56 0
|
7月前
|
存储 安全 Java
JavaSE基础篇:泛型说明
JavaSE基础篇:泛型说明
|
7月前
|
存储 Java
Java的接口、类、属性、方法的修饰符使用总结
Java的接口、类、属性、方法的修饰符使用总结
392 0
【JavaSE专栏65】内部类的使用,定义在其他类内部的类
【JavaSE专栏65】内部类的使用,定义在其他类内部的类