枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数。枚举在日常生活中很常见,例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就是一个枚举。
Java 枚举类使用 enum 关键字来定义,各个常量使用逗号" , "来分割,结尾使用分号" ; "结束。
在类外部定义
// A simple enum example where enum is declared
// outside any class (Note enum keyword instead of
// class keyword)
enum Color {
RED,
GREEN,
BLUE;
}
public class Test {
// Driver method
public static void main(String[] args)
{
Color c1 = Color.RED;
System.out.println(c1);
}
}
输出:
RED
在类内部定义
// enum declaration inside a class.
public class Test {
enum Color {
RED,
GREEN,
BLUE;
}
// Driver method
public static void main(String[] args)
{
Color c1 = Color.RED;
System.out.println(c1);
}
}
输出:
RED
- 枚举中的第一行应该是常量列表,然后是其他内容,如方法、变量和构造函数。
- 根据Java命名约定,建议我们用全大写字母命名常量
枚举类
enum 定义的枚举类默认继承了 java.lang.Enum 类,并实现了 java.lang.Serializable 和 java.lang.Comparable 两个接口。
values(), valueOf(),compareTo() 和 ordinal()方法位于 java.lang.Enum 类中:
values()
values( ) 方法
可以将枚举的所有成员以数组形式返回,也可以通过该方法获取枚举类型的成员。
package test001;
public class test002 {
public static void main(String[] args) {
// Season[] nums = Season.values();
for (Season num:Season.values()) {
System.out.println(num);
}
}
}
enum Season{
// SPRING,SUMMER,AUTUMN,WINDAY;
SPRING("春天"),SUMMER("夏天"),AUTUMN("秋天"),WINDAY("冬天");
private String name;
private Season(String name){
this.name=name;
}
@Override
public String toString() {
return name;
}
}
运行结果:
春天
夏天
秋天
冬天
valueOf
public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)
返回带指定名称的指定枚举类型的枚举常量。名称必须与在此类型中声明枚举常量所用的标识符完全匹配。(不允许使用额外的空白字符。)
参数:
enumType
- 要从中返回常量的枚举类型的 Class 对象
name
- 要返回的常量名称
返回:
带指定名称的指定枚举类型的枚举常量
抛出:
IllegalArgumentException
- 如果指定枚举类型不包含指定名称的常量,或者指定类对象不表示枚举类型
NullPointerException
- 如果 enumType 或 name 为空
从以下版本开始:
1.5
package test001;
public class test002 {
public static void main(String[] args) {
System.out.println(Season.valueOf("SPRING"));
}
}
enum Season{
SPRING("春天"),SUMMER("夏天"),AUTUMN("秋天"),WINDAY("冬天");
private String name;
private Season(String name){
this.name=name;
}
@Override
public String toString() {
return name;
}
}
运行结果:
春天
ordinal
public final int ordinal()
返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。 大多数程序员不会使用此方法。它被设计用于复杂的基于枚举的数据结构,比如 EnumSet
和 EnumMap
。
返回:
枚举常量的序数
package test001;
public class test002 {
public static void main(String[] args) {
for (Season num:Season.values()) {
System.out.println(num+"索引为 "+num.ordinal());
}
}
}
enum Season{
SPRING("春天"),SUMMER("夏天"),AUTUMN("秋天"),WINDAY("冬天");
private String name;
private Season(String name){
this.name=name;
}
@Override
public String toString() {
return name;
}
}
运行结果:
春天索引为 0
夏天索引为 1
秋天索引为 2
冬天索引为 3
compareTo
public final int compareTo(E o)
比较此枚举与指定对象的顺序。在该对象小于、等于或大于指定对象时,分别返回负整数、零或正整数。 枚举常量只能与相同枚举类型的其他枚举常量进行比较。该方法实现的自然顺序就是声明常量的顺序。
指定者:
接口 Comparable<E extends Enum<E>>
中的 compareTo
参数:
o
- 要比较的对象。
返回:
负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。
package test001;
public class test002 {
public static void main(String[] args) {
Season[] nums = Season.values();
System.out.println(Season.AUTUMN.compareTo(Season.SPRING));
}
}
enum Season{
SPRING,SUMMER,AUTUMN,WINDAY;
}
运行结果:
2
enum实现接口
使用enum关键字后,就不能再继承其它类了,因为enum会隐式继承Enum,而Java是单继承机制
枚举类和普通类一样,可以实现接口,如下形式:
enum 类名 implements 接口1,接口2{ }
package test001;
public class test002 {
public static void main(String[] args) {
Music.CLASSICMUSIC.playing();
}
}
interface IPlaying {
public void playing();
}
enum Music implements IPlaying{
CLASSICMUSIC;
public void playing(){
System.out.println("播放音乐");
}
}
运行结果:
播放音乐