概念
当需要一组常量时,建议使用枚举类。即类的对象是有限个的、确定的
比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。
- 若枚举只有一个对象,则可以作为一种单例模式的实现方式
定义
1. 自定义枚举类
jdk5.0之前,需要自定义枚举类
枚举类中已经定义好了一组静态对象,直接使用类调用即可
publicclasstest {
publicstaticvoidmain(String[] args) {
Seasonautumn=Season.AUTUMN;
System.out.println(autumn.getSeasonName());//秋天
}
}
//自定义枚举类
classSeason{
//1.声明Season对象的属性:private final 修饰
privatefinalStringseasonName;
privatefinalStringseasonDesc;
//2.私有化类的构造器(防止外界调用,产生不确定个数的对象),并给对象属性赋值
privateSeason(StringseasonName, StringseasonDesc) {
this.seasonName=seasonName;
this.seasonDesc=seasonDesc;
}
//3.提供当前枚举类的一组对象:public static final修饰(需要不可变,直接用类调用)
publicstaticfinalSeasonSPRING=newSeason("春天", "春暖花开");
publicstaticfinalSeasonSUMMER=newSeason("夏天", "夏暖花开");
publicstaticfinalSeasonAUTUMN=newSeason("秋天", "秋暖花开");
publicstaticfinalSeasonWINTER=newSeason("冬天", "冬暖花开");
//4.获取枚举类对象的属性
publicStringgetSeasonName() {
returnseasonName;
}
publicStringgetSeasonDesc() {
returnseasonDesc;
}
//5.提供toString方法
@Override
publicStringtoString() {
return"Season{"+
"seasonName='"+seasonName+'\''+
", seasonDesc='"+seasonDesc+'\''+
'}';
}
}
2. enum定义枚举类
jdk5.0之后,可以使用enum关键字定义枚举类
publicclasstest {
publicstaticvoidmain(String[] args) {
Seasonspring=Season.SPRING;
System.out.println(spring);//SPRING
System.out.println(Season.class.getSuperclass());//class java.lang.Enum
//可以看出,enum默认继承java.lang.Enum类,它重写了toString方法,直接输出对象名
}
}
enumSeason{
//1.提供当前枚举类的对象,对象之间用','分隔,末尾对象用';'结束
//若无属性,括号也可省略
SPRING("春天", "春暖花开"),
SUMMER("夏天", "夏暖花开"),
AUTUMN("秋天", "秋暖花开"),
WINTER("冬天", "冬暖花开");
//2.声明Season对象的属性:private final 修饰
privatefinalStringseasonName;
privatefinalStringseasonDesc;
//3.私有化类的构造器(防止外界调用,产生不确定个数的对象),并给对象属性赋值
privateSeason(StringseasonName, StringseasonDesc) {
this.seasonName=seasonName;
this.seasonDesc=seasonDesc;
}
//4.获取枚举类对象的属性
publicStringgetSeasonName() {
returnseasonName;
}
publicStringgetSeasonDesc() {
returnseasonDesc;
}
}
enum类的主要方法
values()
:返回枚举类中的对象数组
valueOf(String str)
:将一个字符串转为对应的枚举类对象(字符串必须是枚举类对象)
toString()
:返回当前 枚举类 对象常量 的名称
使用enum定义的枚举类实现接口
- 实现接口,在enum类中实现抽象方法
这样子,每个枚举类对象调用此方法,执行的一样 - 让枚举类的对象分别实现接口中的抽象方法
这样子,每个枚举类对象调用方法,执行的不同
interfaceinter{
voidshow();
}
enumSeasonimplementsinter{
//1.提供当前枚举类的对象,对象之间用','分隔,末尾对象用';'结束
SPRING("春天", "春暖花开"){
@Override
publicvoidshow() {
}
},
SUMMER("夏天", "夏暖花开"){
@Override
publicvoidshow() {
}
},
AUTUMN("秋天", "秋暖花开"){
@Override
publicvoidshow() {
}
},
WINTER("冬天", "冬暖花开"){
@Override
publicvoidshow() {
}
};
//2.声明Season对象的属性:private final 修饰
privatefinalStringseasonName;
privatefinalStringseasonDesc;
//3.私有化类的构造器(防止外界调用,产生不确定个数的对象),并给对象属性赋值
privateSeason(StringseasonName, StringseasonDesc) {
this.seasonName=seasonName;
this.seasonDesc=seasonDesc;
}
//4.获取枚举类对象的属性
publicStringgetSeasonName() {
returnseasonName;
}
publicStringgetSeasonDesc() {
returnseasonDesc;
}
}