枚举类学习笔记
枚举类:类的对象是确定的,有限个的。
当需要定义一组常量的时候,建议使用枚举类。
自定义枚举类
JDK1.5之前,没有enum关键字定义枚举类,需要自定义枚举类。
步骤:
- 对象确定,即构造器要私有,在外部不能创建对象。(根据有无属性,选择构造器带不带参数)
- 对象的属性不能更改,即属性需要private final修饰。(在对象创建的时候,对象的属性就确定了。)
- 类内部自己创建对象,且对象不能更改,用static final修饰,外部可以访问,用public修饰。
示例:
/**
*自定义创建枚举类。
*
* @Author:xiezr
* @Creat:2021-07-13 11:38
*/
public class EnumStudy {
public static void main(String[] args) {
System.out.println(Season.SPRING);
System.out.println(Season.SPRING.getSeasonName());
}
}
// 自定义枚举类
class Season{
// 构造器私有
private final String seasonName;
// 创建对象的时候同时赋值
private Season(String seasonName){
this.seasonName = seasonName;
}
// 提供枚举类的对象
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("冬天");
// 提供一个方法,让外部可以通过枚举类对象获取对象的属性
public String getSeasonName() {
return seasonName;
}
// toString(),不提供toString()的话,打印的是对象的地址值
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
'}';
}
}
enum关键字定义枚举类
步骤:
- enum定义枚举类
- 提供枚举类的对象,写在最前面,多个对象之间用“,”隔开,最后一个对象用“;”结束。
- 根据是否需要给对象提供属性,声明属性和显示定义有参构造器赋值。
示例:
/**
* @Author:xiezr
* @Creat:2021-07-13 13:47
*/
public class Use_enum {
public static void main(String[] args) {
// 这里没有重写toString()方法,打印一下看看是不是地址值
System.out.println(Week.MONDAY);
System.out.println(Week.MONDAY.getWeekName());
}
}
enum Week{
// 先提供枚举类的对象,必选项
MONDAY("星期一"),
TUESDAY("星期二"),
WEDNESDAY("星期三"),
THURSDAY("星期四"),
FRIDAY("星期五"),
SATURDAY("星期六"),
SUNDAY("星期天");
// 提供枚举类对象的属性,可选项
private final String weekName;
// 给对象赋值,可选项
private Week(String weekName){
this.weekName = weekName;
}
// 提供get(),访问对象属性
public String getWeekName() {
return weekName;
}
}
直接打印Week.MONDAY,并没有打印地址值,我们也没有重写toString方法,所以隐式继承的类并不是Object,通过getSuperclass()查看一下这个枚举类继承的类。
可以看到,enum定义的枚举类是继承java.lang包下的Enum类的。这个类重写toString(),返回的是枚举类的常量对象名。
Enum类的常用方法
- toString():返回对象的名称。
- valueOf(String objName):把一个字符串转换为对应的枚举对象,要求字符串必须是枚举类对象的“名字”。(字符串匹配不到符合的枚举类对象名的话抛出异常IllegalArgumentException)
- values():返回所有枚举类对象构成的数组。
示例:
枚举类StateImpl:
/**
* 使用enum定义枚举类之后,让枚举类对象分别实现接口。
*
* @Author:xiezr
* @Creat:2021-07-13 17:16
*/
public enum StateImpl implements State{
FREE("空闲"){
@Override
public void show() {
System.out.println("悠哉游哉");
}
},
TIRED("疲惫"){
@Override
public void show() {
System.out.println("一直学习,没打游戏,我真的好累");
}
},
BUSY("忙碌"){
@Override
public void show() {
System.out.println("学习使我快乐。");
}
};
private final String describe;
private StateImpl(String describe){
this.describe = describe;
}
@Override
public String toString() {
return "StateImpl{" +
"describe='" + describe + '\'' +
'}';
}
}
测试:
/**
* @Author:xiezr
* @Creat:2021-07-13 17:23
*/
public class TestDemo {
@Test
public void test(){
StateImpl happy = StateImpl.TIRED;
// toString()返回对象的名称
System.out.println(happy.toString());
System.out.println("=======================================");
// valueOf()把一个字符串转换为对应的枚举对象,要求字符串必须是枚举类对象的“名字”
// 字符串匹配不到符合的枚举类对象名的话抛出异常IllegalArgumentException
System.out.println(StateImpl.valueOf("TIRED"));
try{
System.out.println(StateImpl.valueOf("I AM IRON MAN"));
}catch (Exception e){
System.out.println(e);
}
System.out.println("=======================================");
// values()返回所有枚举类对象构成的数组
StateImpl[] states = StateImpl.values();
for (int i = 0; i < states.length; i++) {
System.out.println(states[i]);
}
System.out.println("=======================================");
StateImpl.TIRED.show();
}
}