一、目录
- 枚举介绍
- 自定义类实现枚举
- enum关键字实现枚举
- Enum类常用方法
- enum实现枚举练习
- enum实现枚举细节
枚举是一组常量的集合。 可以理解为:枚举属于一种特殊的类,里面只包含了一组有限的特定的对象。
枚举的实现方式有两种:
- 自定义类实现枚举
- 使用系统提供的enum关键字实现枚举
- 不需要提供setXxx方法,因为枚举对象值通常为只读。
- 对枚举对象/属性使用 final + static 共同修饰,实现底层优化。
- 枚举对象名通常使用全部大写,常量的命名规范。
- 枚举对象根据需要,也可以有多个属性。
package com.enumclass;
public class EnumSeasons {
public static void main(String[] args) {
System.out.println(Seasons.AUTOMN);
}
}
class Seasons{
private String name;
private String desc;
//将构造器私有化,目的就是不让直接new出来这个类,信息不会被修改。
private Seasons(String name, String desc) {
this.name = name;
this.desc = desc;
}
//定义四个对象
public final static Seasons SPRING = new Seasons("Spring", "Warm");
public final static Seasons SUMMER = new Seasons("Summer", "Hot");
public final static Seasons AUTOMN = new Seasons("Automn", "Comfortable");
public final static Seasons WINTER = new Seasons("Winter", "Cold");
@Override
public String toString() {
return "Seasons{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
//Seasons{name='Automn', desc='Comfortable'}
特点:
- 构造器私有化。
- 本类内部创建一组对象。
- 对外暴露对象(通过为对象添加public final static修饰符)。
- 可以提供get方法,但是不要提供set方法。
-
使用关键字enum替代class。
-
使用常量名(形参列表)。
-
如果有多个常量(对象),使用逗号间隔即可。
-
如果使用enum来实现枚举,要求将定义的常量对象写在最前面。
-
当我们使用enum关键字实现枚举类时,默认会继承Enum类。而且我们写的类还是个final类。
-
如果使用无参构造器创建枚举对象,则实参列表和小括号都可以省略。例如SUMMER;
package com.enumclass;
public class UseEnum {
public static void main(String[] args) {
System.out.println(UseEnumSeasons.AUTOMN);
System.out.println(UseEnumSeasons.SPRING);
}
}
enum UseEnumSeasons{
SPRING("Spring", "Warm"), SUMMER("Summer", "Hot"),
AUTOMN("Summer", "Hot"), WINTER("Winter", "Cold");
private String name;
private String desc;
private UseEnumSeasons(String name, String desc) {
this.name = name;
this.desc = desc;
}
@Override
public String toString() {
return "Seasons{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
//Seasons{name='Summer', desc='Hot'}
//Seasons{name='Spring', desc='Warm'}
五、Enum类常用方法
package com.enumclass;
public class UseEnum {
public static void main(String[] args) {
UseEnumSeasons season = UseEnumSeasons.AUTOMN;
UseEnumSeasons winter = UseEnumSeasons.WINTER;
//输出枚举对象的名字
System.out.println(season.name());
//输出枚举对象的次序,从0开始
System.out.println(season.ordinal());
//枚举出定义的所有对象,这个方法反编译可以看到
UseEnumSeasons[] values = UseEnumSeasons.values();
for(UseEnumSeasons seasons : values){ //增强for循环
System.out.println(seasons);
}
//valueOf:将字符串转换成枚举对象,要求字符串必须是已有的常量名,否则报异常
//执行流程
//1. 根据输入的字符串,到类的枚举对象去寻找
//2. 如果找到了就返回,没有找到就异常。
UseEnumSeasons seasons = UseEnumSeasons.valueOf("SPRING");
System.out.println(seasons);
//compareTo:比较两个枚举常量,比较的就是编号
System.out.println(season.compareTo(winter));
}
}
enum UseEnumSeasons{
SPRING("Spring", "Warm"), SUMMER("Summer", "Hot"),
AUTOMN("Summer", "Hot"), WINTER("Winter", "Cold");
private String name;
private String desc;
private UseEnumSeasons(String name, String desc) {
this.name = name;
this.desc = desc;
}
@Override
public String toString() {
return "Seasons{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
AUTOMN
2
Seasons{name='Spring', desc='Warm'}
Seasons{name='Summer', desc='Hot'}
Seasons{name='Summer', desc='Hot'}
Seasons{name='Winter', desc='Cold'}
Seasons{name='Spring', desc='Warm'}
-1
六、enum实现枚举练习
声明Week枚举类,其中包含星期一至星期日的定义。使用values返回所有的枚举数组,并遍历。
package com.enumclass;
public class Week {
public static void main(String[] args) {
GoWeek[] values = GoWeek.values();
for(GoWeek days : values){
System.out.println(days);
}
}
}
enum GoWeek{
MONDAY("This is Monday"),
TUESDAY("This is Tuesday");
private String desc;
GoWeek(String desc) {
this.desc = desc;
}
@Override
public String toString() {
return desc;
}
}
//This is Monday
//This is Tuesday
七、enum实现枚举细节
- 使用enum关键字后,就不能再继承其他类了,因为enum会隐式的继承Enum类,而Java是单继承机制。
- 枚举类和普通类一样,可以实现接口,形式如下: enum 类名 implements 接口1, 接口2{…}