目录
介绍:
1)枚举对应英文(enumeration,简写为enum)
2)枚举是一种常量的集合
3)可以理解为:枚举是一种特殊的类,里面只包含一组有限的特定的对象
枚举的两种实现方式:
a:自定义类实现枚举
b:使用enum关键字实现枚举
自定义类实现枚举
1、不需要提供setXxx方法,因为枚举对象值通常为只读
2、对枚举对象/属性使用 final + static 共同修饰,实现底层优化
3、枚举对象名通常使用全大写,常量的命名规范
4、枚举对象根据需要,也可以有多个属性
// 1、将构造器私有化,防止外部直接new新的对象
// 2、去掉setXxx方法,防止属性被修改
// 3、在类的内部直接创建固定对象
// 4、优化,可以加入final修饰符
class Season{
private String name;
private String desc;
// 定义四个对象
public final static Season SPRING = new Season("春天","温暖");
public final static Season SUMMER = new Season("夏天","炎热");
public final static Season AUTUMN = new Season("秋天","凉爽");
public final static Season WINTER = new Season("冬天","寒冷");
private Season(String name, String desc) {
super();
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
}
小结:
1)构造器私有化
2)本类内部创建需要的对象
3)对外暴露对象(通过对对象添加 public final static修饰符)
4)可以提供get方法,但不要提供set方法
enum关键字实现枚举
// 1、使用关键字enum替代class关键字
// 2、public static final Season SPRING = new Season("春天","温暖");
// 直接使用SPRING("春天","温暖"); 进行替代常量名(实参列表)
// 3、如果有多个常量(对象).使用,进行间隔
// 4、使用关键字来实现枚举,要求将定义常量对象写在前面
enum Season2{
SPRING("春天","温暖"),SUMMER("夏天","炎热"),
AUTUMN("秋天","凉爽"),WINTER("冬天","寒冷");
private String name;
private String desc;
private Season2(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
}
注意事项:
A:当使用enum关键字进行开发一个枚举时,默认会继承Enum类(可以使用javap工具进行反编译证明)
B:传统的public static final Season SPRING = new Season("春天","温暖");
简化为 SPRING("春天","温暖");
C:如果使用无参构造器创建枚举对象,则实参列表和小括号都可以省略
D:当有多个枚举对象时,使用,进行间隔,最后结尾为一个分号
E:枚举对象必须放在枚举值的行首
enum的成员方法:
说明:使用enum关键字时,会隐式的继承Enum类,这样就能够使用Enum类的相关方法
public abstract class Enum <E extends Enum<E>> implements Comparable<E>,Serializable{
}
主方法中使用Season2进行测试:
Season2 autumn = Season2.AUTUMN;
// 输出枚举对象名字
System.out.println(autumn.name());//AUTUMN
// 输出该枚举对象的次序/编号,从零开始进行编号
System.out.println(autumn.ordinal());//2
// 返回含义定义的所有枚举对象
Season2 [] values = Season2.values();
System.out.println("遍历取出枚举对象(增强for)");
for(Season2 season : values) {//增强for循环
System.out.println(season);
}
// SPRING
// SUMMER
// AUTUMN
// WINTER
// valueof:将字符串转换成枚举对象,要求字符串必须已有的常量名,否则报异常
// 流程为:
// 1、根据你输入的“AUTUMN”到Season2的枚举对象去查找
// 2、如果找到了,就返回,如果没找到,就报错
Season2 season = Season2.valueOf("AUTUMN");
// Season2 season = Season2.valueOf("AUTUMNXXX");会报错,因为在枚举类
// 中没有名为AUTUMNXXX的枚举对象
System.out.println("season = "+season);//season = AUTUMN
System.out.println(autumn == season);//true
// 就是将 Season2.AUTUMN 枚举对象的编号 和 Season2.SPRING 枚举对象的编号
// 进行比较函数返回值为:return self.ordinal - other.ordinal;
// 即使用前者的编号减去后者的编号
System.out.println(Season2.AUTUMN.compareTo(Season2.SPRING));//2
enum实现接口:
1)使用enum关键字后,就不能再继承其他类了,因为enum会隐式继承Enum,而java是单继承机制
2)枚举类与普通类一样,可以实现接口,如下形式
enum 类名 implements 接口1,接口2{}