1.枚举的定义
枚举是从Java5开始提供的一种新的数据类型,是一个特殊的类,就是固定的多个常量对象的集合.
定义格式:[修饰符] enum 枚举类名
{
常量A,常量B,常量C;
}
enum Weekday
{
MONDAY,TUSESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY;
}
2.枚举类的特点
枚举特点① 枚举的直接父类java.lang.Enum,但是不能显示继承Enum。
enum Weekday extends Enum //报错
{
MONDAY,TUSESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY;
}
② 枚举就相当于一个类,
可以定义构造方法、成员变量、普通方法和抽象方法。
enum Weekday
{
MONDAY,TUSESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY;
public void doWork(){
System.out.println("普通方法");
};
}
③ 默认私有构造方法,即使不写访问权限也是private((假构造器,底层没有无参数构造器)。
enum Weekday
{
MONDAY,TUSESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY;
Weekday(){
System.out.println("无参数构造方法");
}
}
④ 每个实例分别用一个全局常量表示,枚举类的对象是固定的,实例个数有限, 不能使用new关键字。
enum Weekday
{
MONDAY,TUSESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY;
}
class Test
{
public static void main(String[] args){
Weekday week = new Weekday(); //尝试创建对象,结果报错: 无法实例化枚举类型
}
}
⑤ 枚举实例必须位于枚举体中的最开始部分,枚举实例列表最后要有分号与其他成员相分隔。
错误写法:
enum Weekday
{
void doWork(){
System.out.println("其他方法");
};
MONDAY,TUSESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY; //枚举实例必须放最前面,其他方法,变量都放在后面,否则报错
}
正确写法:
enum Weekday
{
MONDAY,TUSESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY; //枚举实例必须放最前面,其他方法,变量都放在后面,否则报错
void doWork(){
System.out.println("其他方法");
};
}
⑥ 枚举实例后有花括号时,该实例是枚举类的匿名内部类对象(查看编译后的class文件)。
3.枚举的使用
1):枚举中都是全局公共的静态常量,可以直接使用枚举类名调用.Weekday day = Weekday.SATURDAY;
enum Weekday
{
MONDAY,TUSESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY;
}
class Test
{
public static void main(String[] args){
Weekday day = Weekday.SUNDAY;
System.out.println(day); //SUNDAY
}
}
2):因为java.lang.Enum类是所有枚举类的父类,所以所有的枚举对象可以调用Enum类中的方法.
String name = 枚举对象.name(); //返回枚举对象的常量名称
int ordinal = 枚举对象.ordinal();//返回枚举对象的序号,从0开始.
String str = 枚举对象.toString():返回 枚举对象的常量名称
3):编译器生成的枚举类的静态方法( 从反编译代码中查看):
枚举类型[] values();
Weekday[] ws = Weekday.values();:返回当前枚举类型所有的常量,使用一个数组封装起来.
枚举类型 valueof(String name);
Weekday day = Weekday.valueOf("MONDAY");//把一个指定名称字符串转换为当前枚举类中同名的常量.
enum Weekday
{
MONDAY,TUSESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY;
}
class Test
{
public static void main(String[] args){
Weekday sunday = Weekday.SUNDAY;
String day = sunday.name();
int ordinal = sunday.ordinal();
String day2 = sunday.toString();
System.out.println(day); //SUNDAY
System.out.println(ordinal); //6
System.out.println(day2); //SUNDAY
Weekday[] ws = Weekday.values();
for(Weekday weekday: ws){
System.out.println(weekday); //MONDAY,TUSESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY
}
}
}
4):从java5开始出现枚举,switch也支持操作枚举类型.
switch只支持int类型,支持枚举是因为底层使用的枚举对象的ordinal,而ordinal的类型依然是int类型.