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

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

相关文章
|
7月前
|
Java
在Java中,多态性是通过继承和接口实现的
【4月更文挑战第7天】在Java中,多态性是通过继承和接口实现的
72 1
|
7月前
|
Java 编译器 API
JavaSE基础篇:反射(二)
JavaSE基础篇:反射(二)
|
7月前
|
Java
Java的实现类的封装性
Java的实现类的封装性
|
7月前
|
Java
java面试基础 -- 普通类 & 抽象类 & 接口
java面试基础 -- 普通类 & 抽象类 & 接口
47 0
|
7月前
|
安全 Java 编译器
Java基础教程(14)-Java中的枚举类,泛型和注解
【4月更文挑战第14天】枚举类型(enum)是固定常量集合,Java中用`enum`定义。特点包括:使用enum关键字,定义类型名和值,可独立或嵌入定义,可实现接口,定义变量和方法。枚举在switch语句中适用,每个枚举值在JVM中唯一,不能继承Enum类。
|
Java 编译器
【JavaSE】抽象类
【JavaSE】抽象类
【JavaSE】抽象类
|
Java
Java Reflection机制 实现类的反射与动态调用
Java Reflection机制被广泛用于实现类的反射和动态调用,反射是指在运行时检查和操作类的能力。只需要一个类的名称或对象的引用,就可以获取类的信息,调用类的方法,创建对象实例等。
61 0
|
Java Spring
JAVA中的注解可以继承吗?
JAVA中的注解可以继承吗?
918 0
JAVA中的注解可以继承吗?
|
7月前
|
存储 设计模式 安全
JavaSE基础篇:反射(一)
JavaSE基础篇:反射(一)
JavaSE基础篇:反射(一)
|
Java 编译器
JavaSE抽象类和接口
JavaSE抽象类和接口