enum枚举类
引出:如果我们有一个类Season表示季节,众所周知季节只有春夏秋冬四个,我们为了避免出现定义错误的季节对象,就要使用到enum枚举类,枚举类可以帮助我们固定好实例化对象,使我们不能进行修改
public class Enumeration01 {
public static void main(String[] args) {
//定义春夏秋冬
Season spring = new Season("春天","温暖");
Season summer = new Season("夏天","炎热");
Season autumn = new Season("秋天","凉爽");
Season winter = new Season("冬天","寒冷");
//此时可以定义错误的对象
Season error = new Season("坦克","武器");
}
}
class Season{
private String name; //季节名称
private String desc; //季节特点
public Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
分类
-
自定义枚举类
- 枚举类不能修改属性,所以setXxx()方法不能起作用
- 对枚举对象(属性)使用final + static修饰,实现底层优化
- 枚举对象名通常全部大写,常量的命名规范
- 枚举对象可以有多个属性
public class Enumeration01 { public static void main(String[] args) { Season spring = Season.SPRING; Season summer = Season.SUMMER; Season autumn = Season.AUTUMN; Season winter = Season.WINTER; System.out.println(spring); System.out.println(summer); System.out.println(autumn); System.out.println(winter); } } 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) { //private关键字防止在外部类中实例化 this.name = name; this.desc = desc; } public String getName() { return name; } public String getDesc() { return desc; } @Override public String toString() { //重写toString()方法,返回对象中的属性 return "Season{" + "name='" + name + '\'' + ", desc='" + desc + '\'' + '}'; } }
-
enum关键字定义枚举类
- 使用关键字enum代替class
- public static final Season SPRING = new Season(“春天”,“温暖”);可以替换成SPRING(“春天”,“温暖”);
- 如果有多个常量(对象),要使用‘,’隔开
- 常量(对象)要写到枚举类的最前面
public class Enumeration01 { public static void main(String[] args) { Season spring = Season.SPRING; Season summer = Season.SUMMER; Season autumn = Season.AUTUMN; Season winter = Season.WINTER; System.out.println(spring); System.out.println(summer); System.out.println(autumn); System.out.println(winter); } } enum Season{ SPRING("春天","温暖"), SUMMER("夏天","炎热"), AUTUMN("秋天","凉爽"), WINTER("冬天","寒冷"); private String name; private String desc; private Season(String name, String desc) { //private关键字防止在外部类实例化 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 + '\'' + '}'; } }
注意
- enum关键字定义的枚举类其实隐式的继承了Enum类,并且自身还被final修饰
- 传统的 public static final Season SPRING = new Season(“春天”,“温暖”),简化成SPRING(“春天”,“温暖”)要知道调用的是哪个构造器
- 如果使用无参构造器,那么实参列表和小括号都可以省略
- 当有多个枚举对象时,使用’,'隔开,最后一个使用分号结尾
- 枚举对象必须放在枚举类最前面
Enum成员方法
- toString()方法:Enum类中重写了toString()方法,返回的是枚举类对象的名称比如:
System.out.println(SPRING("春天","温暖"));
返回的是SPRING - name()方法:返回当前枚举类对象的名称
- ordinal()方法:返回当前对象的编号(表示当前对象在枚举类中的位置,从0开始)
- values()方法:返回枚举类中的所有对象,存储到一个数组中,可以进行遍历
- valueOf()方法:将字符串转换成枚举对象,要求字符串必须为已有的常量名,否则报异常
- compareTo()方法:比较两个枚举常量,比较的就是编号
public class Enumeration01 { public static void main(String[] args) { Season spring = Season.SPRING; System.out.println(spring); //toString()方法,返回SPRING System.out.println(spring.name()); //name()方法,返回SPRING System.out.println(spring.ordinal());//ordinal()方法,返回0 Season[] seasons = Season.values(); //values()方法,返回枚举对象数组 for(Season season : seasons){ System.out.println(season); } Season autumn = Season.valueOf("AUTUMN");//valueOf()方法,返回当前字符串表示常量名的对象 System.out.println(spring.compareTo(autumn));//compareTo(Season season)方法,返回0-2 } }