[Java 基础]枚举
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Java 基础]枚举相关的知识,希望对你有一定的参考价值。
概念
枚举(enum)是一个被命名的整型常量的集合。
enum相对于普通常量最明显的好处在于更有组织性。
尽管enum看起来像是一种新的数据类型,事实上,enum是一种受限制的类,并且具有自己的方法。
创建enum时,编译器会为你生成一个相关的类,这个类继承自java.lang.Enum。
java.lang.Enum类声明:
public abstract class Enum<E extends Enum<E>> implements Comparable<E>,
Serializable {} |
enum基本特性
在enum中,提供了一些基本方法:
values()返回enum实例的数组,而且该数组中的元素严格保持在enum中声明时的顺序。
name()返回实例名。
ordinal()返回实例声明时的次序,从0开始。
getDeclaringClass()返回实例所属的enum类型。
可以使用==来比较enum实例,编译器会自动提供equals()和hashCode()方法。此外,java.lang.Enum实现了Comparable和Serializable接口,所以也提供compareTo()方法。
例:展示enum的基本特性
注:有个小细节,如果枚举中没有定义方法,可以在最后一个实例后面加逗号或分号或什么符号都不加
enum Color { RED, GREEN, BLUE // 如果枚举中没有定义方法,也可以在最后一个实例后面加逗号或分号 // RED, GREEN, BLUE, // RED, GREEN, BLUE; }; public class EnumDemo { public static void main(String args[]) { for (Color c : Color.values()) { System.out.println(c + " ordinal: " + c.ordinal()); System.out.print(c.compareTo(Color.GREEN) + " "); System.out.print(c.equals(Color.GREEN) + " "); System.out.println(c == Color.GREEN); System.out.println(c.getDeclaringClass()); System.out.println(c.name()); System.out.println("==================================="); } } }; |
输出:
RED
ordinal: 0 -1 false
false class
com.notes.enumeration.Color RED =================================== GREEN
ordinal: 1 0 true
true class
com.notes.enumeration.Color GREEN =================================== BLUE
ordinal: 2 1 false false class
com.notes.enumeration.Color BLUE =================================== |
enum具有类的特性
enum不能为实例赋值
C、C++语言中的enum,可以为实例直接赋值,但是Java不能用“=”为enum实例赋值。
例:C、C++语言中的enum初始化
#include "stdafx.h" #include <iostream> using namespace std; typedef enum{ ONE = 1, TWO, THREE = 3, TEN = 10 } Number; int _tmain(int argc, _TCHAR* argv[]) { cout << Number::ONE << endl; cout << Number::TWO << endl; cout << Number::THREE << endl; cout << Number::TEN << endl; return 0; } |
输出:
1 2 3 10 |
添加方法
Java虽然不能直接为实例赋值,但是它有更优秀的解决方案:为enum添加方法。
除了不能继承自一个enum外,基本上可以将enum看做一个常规的类(因为enum都继承自类,且Java不支持多重继承,所以enum不能再继承其他类)。
创建新的enum时,可以为其添加多种方法,甚至可以为其添加构造方法。
注意一个细节:如果要为enum定义方法,那么必须在enum的最后一个实例尾部添加一个分号。此外,在enum中,必须先定义实例,不能将字段或方法定义在实例前面。否则,编译器会报错。
例:列举一个错误码的枚举,全面展示如何在枚举中定义普通方法、静态方法、抽象方法、构造方法
public enum ErrorCode { OK(0) { public String getName() { return "成功"; } }, ERROR_A(100) { public String getName() { return "错误A"; } }, ERROR_B(200) { public String getName() { return "错误B"; } }; private ErrorCode(int number) { // 构造方法 this.number = number; } private int number; public int getNumber() { // 普通方法 return number; } public abstract String getName(); // 抽象方法 public static String getAll() { // 静态方法 String result = "["; for(ErrorCode code : ErrorCode.values()){ result |