重拾Java(5)-枚举

从JDK 5开始,枚举被添加到了Java语言中,形式最简单的枚举看起来和其他语言中的枚举类似。但是,在Java中,通过将枚举定义为一种类类型,极大地扩展了枚举的功能,使得枚举可以具有构造函数、方法以及实例变量

一、基础知识

创建枚举需要使用到关键字 enum ,如下所示:

    enum Letter{
        A,B,C,D
    }

标识符 A、B、C、D 等被称为枚举常量,每个枚举常量被隐式声明为 Letter 的公有静态final成员。每个枚举常量的类型是声明它们的枚举的类型 定义了枚举后,可以创建枚举类型的变量,但是不能使用new关键字来实例化枚举,而是通过与基本类型类似的方式声明,例如:

        Letter letter1=Letter.A;
        
        Letter letter2=Letter.B;

可以使用关系运算符“==”来比较两个枚举变量的相等性,例如:

        if (letter1 == letter2) {
            System.out.println("相等");
        } else {
            System.out.println("不相等");
        }

枚举值也可以用于控制switch语句,例如:

        switch (letter1) {
        case A:
            System.out.println("A");
            break;
        case B:
            System.out.println("B");
            break;
        }

在case语句中,枚举常量的名称没有使用枚举类型的名称进行限定,即使用的是 A 而不是 Letter.A ,这是因为 switch 表达式中的枚举类型已经隐式指定了case常量的枚举类型,所以在case语句中不需要使用枚举类型的名称对常量进行限定,如果试图这么做,会造成编译时错误

当使用println() 语句输出枚举变量时,会输出变量指向的枚举常量的名称,例如:

        //输出值为 A
        System.out.println(letter1);

二、枚举是类类型

Java中枚举是类类型,虽然不能使用new关键字来实例化枚举,但是枚举却有和其他类相同的功能,可以为枚举提供构造函数、实例变量和方法,甚至可以实现接口 需要理解的是:每个枚举变量都是所属枚举类型的对象。因此,如果为枚举定义了构造函数,那么当创建每个枚举常量时都会调用该构造函数

为枚举 Letter 提供一个实例变量 index、一个返回index值的方法、两个不同的构造函数 对于每一个枚举常量,指定要调用的构造函数的方法是通过每个常量后面的圆括号中来加以指定

public enum Letter {

    KK(), A(1), B(2), C(3), D(5);

    private int index;

    Letter(int index) {
        this.index = index;
    }

    Letter() {
        this.index = 0;
    }
    
    public int getIndex() {
        return index;
    }

}
    public static void main(String[] args) {
        Letter letter = Letter.KK;
        //输出值为:0
        System.out.println("索引:" + letter.getIndex());
         letter = Letter.B;
         //输出值为:2
        System.out.println("索引:" + letter.getIndex());
    }

此外,枚举有两条限制:

  1. 枚举不能继承其他类。但是所有枚举都隐式自动继承超类 java.lang.Enum
  2. 枚举不能是超类。即枚举不能进行扩展

三、枚举的一些方法

3.1、values()

values() 方法返回一个包含枚举常量列表的数组,例如:

    enum Letter {
        A, B, C, D
    }

    public static void main(String[] args) {
        Letter[] values = Letter.values();
        for (Letter letter : values) {
            System.out.println(letter);
        }
    }

3.2、valueOf(String)

valueOf(String) 方法返回与传递的字符串参数相对应的枚举常量,例如:

    enum Letter {
        A, B, C, D
    }

    public static void main(String[] args) {
        String str = "A";
        Letter le=Letter.valueOf(str);
        //输出值为:A
        System.out.println(le);
    }

3.3、ordinal()

ordinal() 方法返回枚举常量在常量列表中位置的值,这称为枚举常量的序数值,例如:

    enum Letter {
        A, B, C, D
    }

    public static void main(String[] args) {
        Letter letter = Letter.A;
        //输出值为:0
        System.out.println("序数值:" + letter.ordinal());
        letter = Letter.B;
        //输出值为:1
        System.out.println("序数值:" + letter.ordinal());
    }

3.4、compareTo(Enum)

compareTo(Enum) 方法用于比较相同类型的两个枚举常量的序数值,例如:

    enum Letter {
        A, B, C, D
    }

    public static void main(String[] args) {
        Letter letter1 = Letter.A;
        Letter letter2 = Letter.B;
        Letter letter3 = Letter.C;
        compare(letter1, letter2);
        compare(letter1, letter3);
        compare(letter2, letter3);
        // 输出值为:
        // A小于B
        // A小于C
        // B小于C
    }

    public static void compare(Letter letter1, Letter letter2) {
        if (letter1.compareTo(letter2) > 0) {
            System.out.println(letter1.name() + "大于" + letter2.name());
        } else if (letter1.compareTo(letter2) < 0) {
            System.out.println(letter1.name() + "小于" + letter2.name());
        } else {
            System.out.println(letter1.name() + "等于" + letter2.name());
        }
    }

3.5、equals(Enum)

equals(Enum)用于比较两个对象的相等性,只有两个对象都引用同一个枚举中相同的常量时,返回值才为 true

    enum Letter {
        A, B, C, D
    }

    public static void main(String[] args) {
        Letter letter1 = Letter.A;
        Letter letter2 = Letter.B;
        Letter letter3 = Letter.A;
        //输出值:不相等
        if (letter1.equals(letter2)) {
            System.out.println("相等");
        } else {
            System.out.println("不相等");
        }
        //输出值:相等
        if (letter1.equals(letter3)) {
            System.out.println("相等");
        } else {
            System.out.println("不相等");
        }
    }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python研发

go基础编程 day-2

  零值并不等于空值,而是当变量声明为某种来兴后的默认零值,通常情况下默认值为0,bool为false,string为空字符串。

1012
来自专栏算法修养

2016天梯模拟赛 进阶题解

L2-005 集合相似度 题目链接: https://www.patest.cn/contests/gplt/L2-005 题目的意思是要求两个集合的交集中...

4229
来自专栏python3

python re模块

正则表达式(可以称为REs,regex,regex pattens)是一个小巧的,高度专业化的编程语言,它内嵌于python开发语言中,可通过re模块使用。正则...

802
来自专栏阮一峰的网络日志

Ramda 函数库参考教程

学习函数式编程的过程中,我接触到了 Ramda.js。 我发现,这是一个很重要的库,提供了许多有用的方法,每个 JavaScript 程序员都应该掌握这个工具。...

7318
来自专栏CRPER折腾记

JS数组去重!!!一篇不怎么靠谱的"深度"水文

数组去重,这是一个老梗了...今天我又拿出来说了... 我们在考虑全面一点的情况下,数组去重的实现,比如针对NaN,undefined,{}; 这其中涉及的知识...

964
来自专栏禹都一只猫博客

Pandas文本数据处理 | 轻松玩转Pandas(4)

1632
来自专栏鸿的学习笔记

python的迭代器和生成器

迭代是数据处理的基础,迭代可以理解为是一种惰性求值。在python里迭代器和生成器是一回事,使用的是yield关键字。

561
来自专栏天天

字符串

1、charCodeAt方法返回一个整数,代表指定位置字符的Unicode编码。

824
来自专栏海天一树

小朋友学C语言(26):冒泡排序

(一)基本原理(由小到大): 将相邻两个数比较,将大的调到后头。如果有n个数,则要进行n-1趟比较。 在第1趟中要进行n-1次两两比较,在第j趟比较中要进行n-...

3808
来自专栏yl 成长笔记

链表

链表定义:一种递归的数据结构, 它是在集合类的抽象数据,它或者为空, 或者是指向一个节点 (node) 的引用, 该结点含有一个泛型的元素和一个指向另一条链表的...

1311

扫码关注云+社区