一、枚举类的特点
1.类的对象只有有限个,且为静态常量
2.当需要定义一组常量时,强烈建议使用枚举类
二、如何定义枚举类
jdk1.5之前:自定义枚举类
jdk1.5 :可以使用enum关键字来定义枚举类
2.1自定义枚举类实现:
package enumtest;import org.junit.Test;public class SeasonTest {@Testpublic void test(){System.out.println(Season.SPRING.getSeasonName());}
}
class Season{//1.用private final修饰成员变量private final String seasonName;private final String seasonSec;//2.私有化构造器,并给对象属性赋值private Season(String seasonName,String seasonSec){this.seasonName=seasonName;this.seasonSec=seasonSec;}//创建当前枚举类的多个对象public static final Season SPRING=new Season("春天","春乱花开");public static final Season SUMMER=new Season("夏天","夏日炎炎");public static final Season AUTUMN=new Season("秋天","秋高气爽");public static final Season WINTER=new Season("冬天","冰天雪地");public String getSeasonName() {return seasonName;}public String getSeasonSec() {return seasonSec;}@Overridepublic String toString() {return "Season{" +"seasonName='" + seasonName + '\'' +", seasonSec='" + seasonSec + '\'' +'}';}
}
2.2 使用enum关键字创建枚举类
package enumtest;import org.junit.Test;public class SeasonTest1 {@Testpublic void test(){System.out.println(Season1.SPRING.getSeasonName());}
}
//使用enum关键字创建枚举类
//定义的枚举类默认继承Enum类
enum Season1{//1.提供当前枚举类的对象(必须在类的开头提供)SPRING("春天","春乱花开"),SUMMER("夏天","夏日炎炎"),AUTUMN("秋天","秋高气爽"),WINTER("冬天","冰天雪地");//2.声明属性private final String seasonName;private final String seasonSec;private Season1(String seasonName,String seasonSec){this.seasonName=seasonName;this.seasonSec=seasonSec;}public String getSeasonName() {return seasonName;}public String getSeasonSec() {return seasonSec;}
}
结果:春天
注意:
1.enum关键字简化了枚举类的定义,同样是在内部创建枚举类的对象,enum关键字的方式无需写private static final,new等关键字,注意这里写了反而会报错。
2.提供的枚举类对象必须在类的开头处提供。多个对象之间用逗号隔开,最后一个分号结尾
如果枚举类中没有声明属性,则默认会有一个String类型的属性并且值就是对象的名字。
3.enum定义的枚举类默认继承Enum类
4.枚举类中的构造方法只能是private
3.Enum的常用方法
1.toString():返回枚举类对象的名称
2.values(); 获得所有枚举对象的数组
3.valueOf(String objName); 根据枚举对象名得到指定的枚举对象(如果没有该对象会抛出异常)
注意:values() 和 valueOf(String objName)方法是编译器生成的方法,在Enum抽象类中找不到。
@Testpublic void test2(){System.out.println(Season1.SPRING.toString());System.out.println(Season1.valueOf("SPRING"));System.out.println(Arrays.toString(Season1.values()));}
结果:
4.使用enum关键字定义的枚举类实现接口
两种方式:
1.向普通类一样实现接口,重写接口中的方法,则,每个枚举类对象都能使用同一个重写方法
2.每个枚举类对象单独实现接口的方法,则每个枚举类对象的重写方法可以不一样。
第一种方式:
//在上面的文件中添加如下代码
//定义一个接口
interface Info{void show();
}
//在Season1类中重写该方法@Overridepublic void show() {System.out.println("枚举类实现的方法");}
测试代码:
@Testpublic void test3(){//每个对象调用的都是同一个重写方法Season1.SPRING.show();Season1.WINTER.show();}
结果 :
第二种方式:
将Season1类中的枚举类对象修改成如下:
SPRING("春天","春乱花开"){@Overridepublic void show() {System.out.println("春天的show");}},SUMMER("夏天","夏日炎炎"){@Overridepublic void show() {System.out.println("夏天的show");}},AUTUMN("秋天","秋高气爽"){@Overridepublic void show() {System.out.println("秋天的show");}},WINTER("冬天","冰天雪地"){@Overridepublic void show() {System.out.println("冬天的show");}};
测试:
@Testpublic void test4(){//每个对象调用的是各自实现的接口方法Season1.SPRING.show();Season1.WINTER.show();}
结果:
补充:如果枚举类中实现了接口的方法,提供的枚举类对象也实现了相同的方法,则后者覆盖前者。