一、枚举类(enumeration):可以把枚举理解为一种特殊的类,里面包含了一组有限的特定的集合。
二、为什么要引入枚举:对于一些固定的对象,例如每周有七天,每年有四个季节等情况。因为这些对象本身就带有确定性和固定性,因此可以选择将这些对象封装到一个类中方便使用以及方便管理,避免这些对象在使用时还得重新创建,比较优雅。
三、枚举类的两种实现方式
1.不使用enum关键字实现枚举
① 将构造器私有化
② 在该类内部创建一组对象,并把这些对象使用(public static final)修饰对外暴露。
③ 可以为类中属性提供get方法,但是不能提供set方法。
package cn.lit.enum_;
public class Enumeration02 {
public static void main(String[] args) {
System.out.println(Season.SPRING);
}
}
class Season{
private String name;
private String desc;
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("冬天","寒冷");
private Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
2.使用enum关键字实现枚举(本质上还是第一种,只不过对其进行了简化,看起来比较优雅)
① 使用enum关键字来代替class
② 构造器私有化
③ 用 常量对象名(“属性1”,“属性2”...)替换自定义枚举时创建对象时的(public static final ...)
④ 可以使用get方法,不能使用set方法
package cn.lit.enum_;
public class Enumeration03 {
public static void main(String[] args) {
System.out.println(Season03.SPRING);
}
}
enum Season03{
SPRING("春天","温暖"),
SUMMER("夏天","炎热"),
AUTUMN("秋天","凉爽"),
WINTER("冬天","寒冷");
private String name;
private String desc;
Season03(String name, String desc) {
this.name = name;
this.desc = desc;
}
}
四、enum关键字实现枚举时注意事项
1.当使用enum关键字开发一个枚举类时,默认会继承Enum类(可以通过反编译查看)。
2. 要清楚的知道SPRING(“春天”,“温暖”)调用的是哪个构造器,看他的参数个数,以及参数类型。
3. 当使用无参构造器创建枚举对象时,实参列表和小括号都可以省略。
4.当有多个枚举对象时,枚举对象之间用“,”隔开,最后一个枚举对象带上“;”
5. 枚举对象必须放在枚举类的行首。
6. 使用了enum关键字以后就不能再使用继承了,因为java为单继承机制。
7. 枚举类和普通类一样,可以实现接口。
五、Enum类常用方法
1. name() 得到当前枚举对象的常量名称
2.ordinal() 返回枚举常量在enum声明中的位置,位置从0开始计数。
3.values() 隐藏的静态方法,返回该枚举类中的枚举对象数组。
4.将字符串转换成枚举对象,要求字符串必须为已有的常量名,否则报异常
5. compareTo() 比较两个枚举对象,比较的就是编号,返回值为编号值相减。
6. tostring() 返回当前枚举对象的常量名称,子类继承可以重写让其返回对象的属性。
package cn.lit.enum_;
/**
* Enum类的常用方法
*/
public class EnumMethod {
public static void main(String[] args) {
Season04 autumn = Season04.AUTUMN;
//name() 输出枚举对象的常量名称
System.out.println(autumn.name());
//ordinal() 输出该枚举对象的次序/编号,从0开始编号
System.out.println(autumn.ordinal());
//values() 返回该枚举类中的枚举对象数组
Season04[] values = Season04.values();
for (Season04 value : values) {
System.out.println(value);
}
//valueOf 将字符串转换成枚举对象,要求字符串必须为已有的常量名,否则报异常
//根据你输入的"AUTUMN"到Season04的枚举对象中去查找
//如果找到了就返回该对象,否则就报错
Season04 autumn1 = Season04.valueOf(Season04.class,"AUTUMN");
System.out.println(autumn1);
//compareTo() 比较两个枚举常量,比较的就是编号,返回值为编号值相减
//返回值为Season04.AUTUMN的编号值-Season04.SPRING的编号值
System.out.println(Season04.AUTUMN.compareTo(Season04.SPRING));
}
}
enum Season04{
SPRING("春天","温暖"),
SUMMER("夏天","炎热"),
AUTUMN("秋天","凉爽"),
WINTER("冬天","寒冷");
private String name;
private String desc;
Season04(String name, String desc) {
this.name = name;
this.desc = desc;
}
@Override
public String toString() {
return "Season04{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}