引入:
当有一些类,希望它的成员的值是具体的有限的值,且只读不需要修改,不希望用户去自定义其他的值。
比如季节类,它的成员只能是春夏秋冬,不希望用户构造其他的值。
枚举enum:
枚举是一组的特殊常量的集合。
是一种特殊的类。
枚举实现:
1、自定义:
①构造器私有化,防止用户自定义。
②去掉set()相关方法,防止属性被修改。
③在类内部直接创建固定的对象。
(public static final)允许被外界直接访问,且值不变。
2、使用enum关键字
①对象名(构造器参数),如果有多个,逗号相隔。(该语句,即常量对象写在最前面)
②写出属性。
③写出构造器。
![](https://img-blog.csdnimg.cn/direct/0ec4ff69e81845c1af2c5dca6e0001e4.png)
细节:
1、枚举对象一般大写。
2、enum相当于自动把构造器的访问权限改为private.
且public static final Season SPRING = new Season("春天","温暖");
等价于SPRING("春天","温暖");
使用
SPRING("春天","温暖");必须明确使用哪个构造器。
若调用无参构造器,可以简化为SPRING;即省略实参和小括号。
3、enum规定常量对象在最前面。
4、Season s1 = Season.SPRING
Season s2 = Season.SPRING
s1 == s2;//正确,因为是静态的,这两个都指向同一个地址。
5、使用关键字enum就无法继承其他类了,因为隐式继承了Enum类,
但是可以实现接口。
6、使用enum时,会默认继承Enum类。
反编译Season.class:
![](https://img-blog.csdnimg.cn/direct/8fb3f1c7d04541e49e3ab1ca2c66d3ab.png)
7、从5、反编译可以看出,它继承自Enum,则其含有父类的所有方法。
![](https://img-blog.csdnimg.cn/direct/7725b239f09044edb170a263a58a525a.png)
8、enum常用方法
![](https://img-blog.csdnimg.cn/direct/6e4b66a6c5ac48ce99f38622218bd79e.png)
从反编译还可以看到有一个values()方法,该方法返回改枚举类的所有对象。