Java基础知识之Enum全接触

简介: Enum是在Java中用来定义枚举类型的关键字。Enum一般用来表示一组相同类型的常量,如性别、日期 、颜色等. 下面是一个最简单的枚举。 1 2 3 4 5 6 7 8 9 10 public enum Color { RED, GREEN, BLUE } 实际上在Java中枚举类型本质上就是一个类,其继承自java.lang.Enum类。

Enum是在Java中用来定义枚举类型的关键字。Enum一般用来表示一组相同类型的常量,如性别、日期 、颜色等.

下面是一个最简单的枚举。

1
2
3
4
5
6
7
8
9
10
public enum Color
{

RED,

GREEN,

BLUE

}

实际上在Java中枚举类型本质上就是一个类,其继承自java.lang.Enum类。

通过默认提供的GetValues()方法可以获取所有枚举对象,其以一个数组的形式返回。

1
2
3
4
5
6
for(Color color : Color.values())
{

System.out.printf("%s: %s%n",color,color.toString());

}

输出结果为:

1
2
3
4
5
RED: RED

GREEN: GREEN

BLUE: BLUE

既然是enum本质上是类,那么我们当然可以给其加一些方法。注意最后一个枚举对象要使用“;”结尾,说明枚举值结束使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public enum Color
{

RED("Red Color"),

GREEN("Green Color"),

BLUE("Blue Color");

private final String color;

private Color(String color) {

    this.color = color;

}

public String getColor() {

return color;

}

}

注意在enum中是不能声明public的构造函数的,这样是为了避免直接实例化enum对象。

我们可以通过getValues()方法调用getColor()方法。

1
2
3
4
5
6
for(Color color : Color.values())
{

System.out.printf("%s: %s%n",color,color.getColor());

}

以下是输出结果:

1
2
3
4
5
RED: Red Color

GREEN: Green Color

BLUE: Blue Color

如果大家还是看不太明白的话,我可以展示一个类来对个对比。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public final class Color extends java.lang.Enum{

    public static final Color RED;

    public static final Color GREEN;

    public static final Color  BLUE;

    static {};

    public java.lang.String getColor();

    public static Color[] values();

    public static Color valueOf(java.lang.String);

}

这个类的作用等同于我们的Color枚举对象。而每个被枚举的成员其实就是定义的枚举类型的一个实例,它们都被默认为final。无法改变常数名称所设定的值,它们也是public和static的成员,这与接口中的常量限制相同。可以通过类名称直接使用它们。

所以我们大胆的在里面增加一些其它的方法来实现我们的新特性。

在这里我增加了一个新的方法isRed()来判断当前枚举实例是否是红色的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public enum Color
{

RED("Red Color"),

GREEN("Green Color"),

BLUE("Blue Color");


private final String color;



private Color(String color) {

    this.color = color;

}


public String getColor() {

return color;

}


public boolean isRed() {

return this.equals(RED);

}

}

可以对其进行一个测试。

1
2
3
4
5
6
7
8
Color green = Color.GREEN;

System.out.print(green.isRed());


Color red = Color.RED;

System.out.print(red.isRed());

第一个输出结果为false,第二个输出结果为true。

通过对Java中enum的运用,往往会产生奇效。比如有这样一个例子,有一个Rover对象,它有一个类型为Enum的direction属性,我们要给Rover实现左转的指令。你可能会写出这样的代码:

Direction.java
1
2
3
4
5
6
public enum Direction {
    North,
    East,
    South,
    West
}
Rover.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Rover {

    private Direction direction;

    public Rover(Direction direction) {
        this.direction = direction;
    }

    public void turnLeft() {
        if (direction.equals(Direction.East)) {
            direction = Direction.North;
        } else if (direction.equals(Direction.North)) {
            direction = Direction.West;
        } else if (direction.equals(Direction.West)) {
            direction = Direction.South;
        } else if (direction.equals(Direction.South)) {
            direction = Direction.East;
        }

    }
}

一大堆if...else的代码看起来真的很丑陋。这还好,如果让你给Rover再加几个方法,比如向右转,旋转到反方向等,那代码就没法看了。 我们可以这样分析一下,其实给定一个方向之后,向左转的方向也就确定了,所以我们可以将这些逻辑放置到Direction对象中去。下面是改进后的版本。

Direction.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public enum Direction {
    North {
        @Override
        public Direction turnLeft() {
        return West;
        }
    },
    East {
        @Override
        public Direction turnLeft() {
            return North;
        }

    },
    South {
        @Override
        public Direction turnLeft() {
            return East;
        }
    },
    West {
        @Override
        public Direction turnLeft() {
            return South;
        }
    };

    public abstract Direction turnLeft();
}
Rover.java
1
2
3
4
5
6
7
8
9
10
11
12
public class Rover {

    private Direction direction;

    public Rover(Direction direction) {
        this.direction = direction;
    }

    public void turnLeft() {
        direction = direction.turnLeft();
    }
}

这样的代码看起来要舒服的多.

C#中的Enum

我也可以简单的讲解下c#中的枚举对象。在c#中声明枚举对象的关键字是enum。

1
2
3
4
 访问修辞符 enum 枚举名:基础类型
    {
        枚举成员
    }

基础类型必须能够表示该枚举中定义的所有枚举数值。枚举声明可以显式地声明 byte、sbyte、short、ushort、int、uint、long 或 ulong 类型作为对应的基础类型。没有显式地声明基础类型的枚举声明意味着所对应的基础类型是 int.

1
2
3
4
5
6
7
8
9
10
11
public enum Color

{

RED,

GREEN,

BLUE

}

所以我们可以直接将一个枚举类型强制转换成其对应的基础类型。

1
Int  num = (int)Color.Red;

Num的值为0.

我们也可以反向转换。

1
Color color = (Color)num;

甚至我们还可以对枚举类型进行与或运算。这些就不细说了,有兴趣的可以查阅相关资料。

相关文章
|
3月前
|
Java C++ 索引
【Java】JavaSE基础知识
【Java】JavaSE基础知识
110 0
|
4月前
|
Java 编译器
Java基础知识:什么是封装、继承和多态?
Java基础知识:什么是封装、继承和多态?
72 0
|
21天前
|
Java 程序员 调度
Java中的多线程编程:基础知识与实践
【4月更文挑战第5天】 在现代软件开发中,多线程编程是一个不可或缺的技术要素。它允许程序员编写能够并行处理多个任务的程序,从而充分利用多核处理器的计算能力,提高应用程序的性能。Java作为一种广泛使用的编程语言,提供了丰富的多线程编程支持。本文将介绍Java多线程编程的基础知识,并通过实例演示如何创建和管理线程,以及如何解决多线程环境中的常见问题。
|
2天前
|
IDE Java 开发工具
Java从入门到精通:1.3.1实践编程巩固基础知识
Java从入门到精通:1.3.1实践编程巩固基础知识
|
2天前
|
Java
Java基础知识整理,驼峰规则、流程控制、自增自减
在这一篇文章中我们总结了包括注释、关键字、运算符的Java基础知识点,今天继续来聊一聊命名规则(驼峰)、流程控制、自增自减。
34 3
|
2天前
|
Java 开发者
Java基础知识整理,注释、关键字、运算符
在日常的工作中,总会遇到很多大段的代码,逻辑复杂,看得人云山雾绕,这时候若能言简意赅的加上注释,会让阅读者豁然开朗,这就是注释的魅力!
37 11
|
27天前
|
关系型数据库 Java 开发工具
Java入门高频考查基础知识9(15问万字参考答案)
本文探讨了Spring Cloud的工作原理,包括注册中心的心跳机制、服务发现机制,以及Eureka默认的负载均衡策略。同时,概述了Spring Boot中常用的注解及其实现方式,并深入讨论了Spring事务的注解、回滚条件、传播性和隔离级别。文章还介绍了MySQL的存储引擎及其区别,特别关注了InnoDB如何实现MySQL的事务处理。此外,本文还详细探讨了MySQL索引,包括B+树的原理和设计索引的方法。最后,比较了Git和SVN的区别,并介绍了Git命令的底层原理及流程。
32 0
Java入门高频考查基础知识9(15问万字参考答案)
|
27天前
|
存储 缓存 算法
Java入门高频考查基础知识4(字节跳动面试题18题2.5万字参考答案)
最重要的是保持自信和冷静。提前准备,并对自己的知识和经验有自信,这样您就能在面试中展现出最佳的表现。祝您面试顺利!Java 是一种广泛使用的面向对象编程语言,在软件开发领域有着重要的地位。Java 提供了丰富的库和强大的特性,适用于多种应用场景,包括企业应用、移动应用、嵌入式系统等。下是几个面试技巧:复习核心概念、熟悉常见问题、编码实践、项目经验准备、注意优缺点、积极参与互动、准备好问题问对方和知其所以然等,多准备最好轻松能举一反三。
55 0
Java入门高频考查基础知识4(字节跳动面试题18题2.5万字参考答案)
|
27天前
|
存储 算法 JavaScript
Java入门高频考查算法逻辑基础知识3-编程篇(超详细18题1.8万字参考编程实现)
解决这类问题时,建议采取下面的步骤: 理解数学原理:确保你懂得基本的数学公式和法则,这对于制定解决方案至关重要。 优化算法:了解时间复杂度和空间复杂度,并寻找优化的机会。特别注意避免不必要的重复计算。 代码实践:多编写实践代码,并确保你的代码是高效、清晰且稳健的。 错误检查和测试:要为你的代码编写测试案例,测试标准的、边缘情况以及异常输入。 进行复杂问题简化:面对复杂的问题时,先尝试简化问题,然后逐步分析和解决。 沟通和解释:在编写代码的时候清晰地沟通你的思路,不仅要写出正确的代码,还要能向面试官解释你的
33 0
|
27天前
|
存储 Java 编译器
Java入门高频考查基础知识2(超详细28题2.5万字答案)
多态是面向对象编程中的一个重要概念,它允许不同类的对象对同一消息作出不同的响应。在具体实现上,多态允许一个父类的引用指向其子类的对象,并根据实际指向的对象的类型来调用相应的方法。在 Java 中,多态可以通过以下几种方式实现:在同一个类中,方法名相同,但形参列表不同,实现了多态。子类可以重写(覆盖)其父类的方法,实现多态。在父类引用中调用该方法时,根据实际指向的子类对象的类型来调用相应的方法实现。
40 0