12.1.1 枚举的基础知识
创建枚举需要使用关键字enum。例如,下面是一个简单的枚举,其中列出了各种苹果的品种:
标识符Jonathan、GoldenDel等被称为枚举常量。每个枚举常量被隐式声明为Apple的公有、静态final成员。此外,枚举常量的类型是声明它们的枚举的类型,对于这个例子为Apple。因此在Java语言中,这些常量被称为是“自类型化的”(self-typed),其中的“自”是指封装常量的枚举。
定义了枚举之后,可以创建枚举类型的变量。但是,尽管枚举定义了类类型,却不能使用new实例化枚举。反而,枚举变量的使用方式在许多方面与基本类型相同。例如,下面这行代码将ap声明为Apple枚举类型的变量:
因为ap是Apple类型,所以只能被赋值为(或包含)在Apple枚举中定义的那些值。例如,下面这行代码将ap赋值为RedDel:
- Apple ap;
- ap = Apple.RedDel;
注意在符号RedDel之前的Apple。
可以使用关系运算符“==”比较两个枚举常量的相等性。例如,下面这条语句比较ap的值和GoldenDel常量:
枚举值也可以用于控制switch语句。当然,所有case语句使用的常量的枚举类型,都必须与switch表达式使用的枚举类型相同。例如,下面这条switch语句是完全合法的:
- if(ap == Apple.GoldenDel) // ...
注意在case语句中,枚举常量的名称没有使用枚举类型的名称进行限定。也就是说,使用的是Winesap而不是Apple.Winesap。这是因为switch表达式中的枚举类型已经隐式指定了case常量的枚举类型。所以在case语句中不需要使用枚举类型的名称对常量进行限定。实际上,如果试图这么做的话,会造成编译时错误。
当显示枚举常量时,例如在println()语句中,会输出枚举常量的名称。例如下面这条语句:
- System.out.println(Apple.Winesap);
会显示名称“Winesap”。
下面的程序用到了刚才介绍的所有内容,并演示了Apple枚举:
|