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类。

通过默认提供的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;

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

时间: 2024-10-22 09:07:42

Java基础知识之Enum全接触的相关文章

Java基础知识之泛型全接触

当我们在定义类,接口和方法时,可以接收一个类型作为参数,这就叫做泛型. 函数可以传入普通的参数,也可以传入一个类型参数.不同之处是普通的参数就是值而已,但是类型参数却是个类型. 使用泛型的好处: 强类型检查.在编译时就可以得到类型错误信息. 避免显式强制转换. 方便实现通用算法. 对类使用泛型 我们可以创建一个简单的Class Box.它提供存取一个类型为Object的对象. 1 2 3 4 5 6 7 8 9 10 public class Box { public Object getObj

《Java和Android开发实战详解》——1.2节Java基础知识

1.2 Java基础知识 Java和Android开发实战详解 Java语言类似于C++是一种编译型语言,不过两者并不完全相同,严格说来,Java是结合编译和解释优点的一种编程语言. 1.2.1 Java平台 "平台"(Platform)是一种结合硬件和软件的执行环境.Java既是一种高级的面向对象的编程语言,也是一个平台.Java平台是一种纯软件平台,它可以在各种基于硬件的平台上运行,与硬件无关,主要是由JVM和Java API两个部分组成. 1.JVM虚拟机 JVM(Java Vi

J2ME中需要的Java基础知识

现在有大部分人,都是从零开始学J2ME的,学习J2ME的时候,总是从Java基础开始学习,而且现在讲Java基础的书籍中都是以J2SE来讲基础,这就给学习造成了一些不必要的麻烦,下面将J2ME中用到的和不需要的Java基础知识做一个简单的说明:        J2ME中使用到的Java基础知识: 1.  Java语法基础:包括基本数据类型.关键字.运算符等等 2.  面向对象的思想:类和对象的概念,继承和多态等等. 3.  异常处理 4.  多线程 J2ME中没有用到的Java基础知识: 1. 

javaeye基础-java基础知识问题求助

问题描述 java基础知识问题求助 问 形如 X(父类) y=new Y(子类): 这样new出来的对象y是子类对象还是父类对象? 如果子类有重载的构造函数,那么在new的时候父类的默认构造函数还会被子类的构造函数调用么? 解决方案 你可以去了解下向上转型和向下转型的区别! 解决方案二: java的一些基础知识 .Java基础知识一Java_计算机基础知识 解决方案三: new 出来的当然是子类对象,但是是父类引用,即父类引用指向之类对象. 子类有重载的构造函数?构造函数是不能重载的 解决方案四

《Android游戏开发详解》一第2章 Java基础知识

第2章 Java基础知识 Android游戏开发详解第1章内容完全是成为Java程序员的准备工作.在本章中,你将编写自己的第一个Java程序(包括一款简单的游戏),并学习如何把游戏的角色.加血(power-up)以及其他实体表示为Java对象.

《Android游戏开发详解》一第1部分 Java基础知识

第1部分 Java基础知识 Android游戏开发详解本文仅用于学习和交流目的,不代表异步社区观点.非商业转载请注明作译者.出处,并保留本文的原始链接.

Java基础知识二十九

Java 基础语法 一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如,一条狗是一个对象,它的状态有:颜色.名字.品种:行为有:摇尾巴.叫.吃等. 类:类是一个模板,它描述一类对象的行为和状态. 方法:方法就是行为,一个类可以有很多方法.逻辑运算.数据修改以及所有动作都是在方法中完成的. 实例变量:每个对象都有独特的实例变量,对象的状态由这些实例变量的值决定. 如果你想学

java基础知识

java语言基础 (一些大家需要了解的知识,或者说学java的需要知道的知识) java需要的api大家可以看下我的关于java API 的文章里面有最新的javaapi(是1.8 的中文版的) 1.java历史 Java语言发展史     詹姆斯·高斯林(James Gosling)1977年获得了加拿大卡尔加里大学计算机科学学士学位,1983年获得了美国卡内基梅隆大学计算机科学博士学位,毕业后到IBM工作,设计IBM第一代工作站NeWS系统,但不受重视.后来转至Sun公司,1990年,与Pa

Java基础知识——SDK、JDK、JRE、JVM、JDT、CDT等之间的区别与联系

  相信大多数java初学者被这些概念搞蒙过,它们之间到底有什么区别,又有什么联系呢?下面我将一一解开大家心中的谜团.首先给大家解释一下这些概念:   1 SDK(Software DevelopKit,软件开发工具包) 用于帮助开发人员的提高工作效率.各种不同类型的软件开发,都可以有自己的SDK.Windows有WindowsSDK,DirectX 有 DirectX 9SDK,.NET开发也有Microsoft.NET FrameworkSDK.JAVA开发也不含糊,也有自己的Java SD