枚举类
枚举类用于定义一组自定义常量。常量的类型为所定义的枚举类的类型。枚举类默认继承java.lang.Enum类,所以枚举类不能再继承其他类,不过枚举类可以实现接口。枚举类的定义包括2个部分:
枚举类声明部分
一般的枚举类声明格式为:[public ]enum 枚举类名[ implements 接口名]
访问限制符:public属于访问限制符。没有被访问限制符修饰的枚举类只能在当前包内被调用。
public:被public修饰的枚举类是一个公共类。可以被任意类或对象调用。每个Java源文件只能有一个public修饰的枚举类。
implements:实现其他接口。每个枚举类可以实现多个接口。省略该部分则表示没有实现任何接口。
枚举类类体部分
枚举类的类体部分是常量的定义。常量定义时会自动调用枚举类的构造方法,所以每一个常量都相当于枚举类的一个实例。
一般的常量定义格式为:常量名[(参数)]
枚举类定义的多个常量之间用“,”隔开,最后一个常量之后加上“;”表示结束。
如果枚举类没有定义构造方法,则会默认提供一个空的无参构造方法,此时可以直接使用常量名定义常量。例如:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 enum Month { 2 3 January, February, March, April, May, June, July, August, September, October, November, December; 4 5 }
如果枚举类定义了成员变量,则需要提供一个带参构造方法为该成员变量赋值,此时需要在常量名后使用“( )”括起参数。例如:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 enum Week { 2 3 Monday("周一"), Tuesday("周二"), Wednesday("周三"), Thursday("周四"), Friday("周五"), Saturday("周六"), Sunday("周日"); 4 5 private String zh_name; 6 7 private Week(String name) { 8 zh_name = name; 9 } 10 11 public String getName() { 12 return zh_name; 13 } 14 15 @Override 16 public String toString() { 17 return super.toString() + "--" + zh_name; 18 } 19 20 }
常量的定义需要放在前头,之后才能是成员变量、构造方法、方法等的定义。
成员变量:枚举类成员变量的定义与类成员变量的定义相同。由于枚举类这一结构的初衷是设置常量,建议把枚举类成员变量都定义为私有变量,且只提供对应的getter方法,不提供对应的setter方法。
构造方法:枚举类不支持通过程序来创建新实例,其构造方法的访问限制符只能为private,或者不加访问限制符。
方法:枚举类方法的定义与类方法的定义相同。
枚举类的使用
获取枚举类型常量
可以通过“枚举类名.常量名”的格式获取指定的常量。常量是枚举类的一个实例,所以常量的类型为枚举类类型。
通过“枚举类名.values()”方法返回一个枚举类型数组,该数组包含了所有常量,顺序为常量定义的顺序。
常用的枚举类方法
常用的枚举类方法主要有:
1.String name()
返回常量名。
2.int ordinal()
返回常量的位标(从0开始)。
测试
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 @Test 2 void testEnum() { 3 Month month = Month.January; 4 System.out.println(month); 5 System.out.println(month.name()); 6 System.out.println(month.ordinal()); 7 System.out.println(Arrays.asList(Month.values())); 8 }
输出结果:
总结:
1.直接输出一个常量,默认情况下会输出常量名。
2.常量的位标与定义时的位标有关。