1、自定义类实现枚举:
1、构造器私有化。
2、本类内部创建一组对象。
3、对外暴露对象:为对象添加 public static final 修饰符。
4、不提供set方法:因为枚举对象值通常为只读。
public static void main(String[] args) {
System.out.println(Season.SPRING);
}
class Saeson {
private String name;
private String desc;
// 3、在类的内部直接定义4个固定对象
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("冬天","寒冷");
// 1、构造器私有化,防止直接new
private Season(String name,String desc) {
this.name = name;
this.desc = desc;
}
// 2、去掉set方法
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
}
2、使用enum关键字来实现枚举:
public static void main(String[] args) {
System.out.println(Season.SPRING);
}
enum Saeson { // 1、使用enum关键字替代class
SPRING("春天","温暖"),WINTER("夏天","炎热"),AUTUMN("秋天","凉爽"),WINTER("冬天","寒冷"); // 2、常量对象写在最前面,多个用逗号间隔。
private String name;
private String desc;
// 1、构造器私有化,防止直接new
private Season(String name,String desc) {
this.name = name;
this.desc = desc;
}
// 2、去掉set方法
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
}
2.1、注意事项
1、当我们使用enum关键字开发一个枚举类时,默认会继承一个Enum类,而且是一个final类。
2、如果使用的是无参构造器创建枚举对象,那么可以省略小括号。
SPRING,WINTER,AUTUMN,WINTER;
3、枚举对象放在枚举类第一行。
练习题:
public static void main(String[] args) {
Gender boy1 = Gender.BOY; // 将枚举对象赋给了boy1
Gender boy2 = Gender.BOY; // 将枚举对象赋给了boy2
System.out.println(boy); // BOY 直接输出一个对象就是默认调用Gender的toString方法,但是因为Gender没有这个方法,就会调用他的父类enum的tostring方法。
/*
enum的tostring方法:
public String toString() {
return name; 直接返回对象名
}
*/
System.out.println(boy1 == boy2);
}
enum Gender {
BOY,GIRL;
}
enum类常用方法:
1、toString方法:返回当前对象名,子类可以重写该方法。
2、name方法:返回当前对象名。
3、ordinal方法:返回当前对象的位置号:从0开始
4、values:返回当前枚举类中所有常量,以数组形式.
5、valueOf:将字符串转化为枚举对象,如果是已有的则匹配,否则报错。
6、compareTo:比较两个枚举常量,值是两个常量编号相减。
public static void main(String[] args) {
System.out.println(Season.SPRING);
Season autumn = Season.AUTUMN;
System.out.println(autumn.name()): // name方法:返回当前对象名。
System.out.println(autumn.ordinal()); // 2它是第三个对象
Season value = Season.valueOf("SPRING");
System.out.println(value);
for(Season season:values) { // 增强型for循环
System.out.println(season); // 依次输出四个对象。
}
System.out.println(Season.AUTUMN.compareTo(Season.SUMMER)); //2-1=0
}
enum Saeson {
SPRING("春天","温暖"),WINTER("夏天","炎热"),AUTUMN("秋天","凉爽"),WINTER("冬天","寒冷");
private String name;
private String desc;
private Season(String name,String desc) {
this.name = name;
this.desc = desc;
}
// 2、去掉set方法
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
}
增强型for循环:
int[] nums = {1,2,3};
for(int i : nums) {
System.out.println(i);
}
枚举细节:
1、enum实现的枚举类不可以继承其它类,因为他已经继承了Eunm类。
2、enum实现的枚举类,可以实现接口
public static void main(String[] args) {
Music.CLASSMUSIC.play();
}
interface IA {
public void play();
}
enum Music implements IA {
CLASSMUSIC;
@Override
public void play() {
System.out.println("播放音乐");
}
}