根据b站韩顺平老师java教学视频学习的学习笔记,视频地址https://www.bilibili.com/video/BV1fh411y7R8p=1&vd_source=d475b6658116009f168918b328e1050b。个人学习理解,如有疏漏,敬请改正。
枚举知识点总结
Enumeration :列举事实,逐条陈诉、详叙
简写:enum 枚举
什么是枚举
枚:一个一个
举:列举
枚举:一个一个的列举出来。一组常量的集合,属于一种特殊的类,里面只包含一组有限的特定的对象。枚举对象通常为只读。
在我们写实体类时需要公开构造器,设置setXxx方法以方便从外部访问或更改属性。如
public class UserDefEnum {
public static void main(String[] args) {
Season SPRING = new Season("春天","春色满园");
Season SUMMER = new Season("夏天","蛙声蝉鸣");
Season AUTUMN = new Season("秋天","叶落风寒");
Season WINTER = new Season("冬天","梅花点点");
System.out.println(SPRING.getSeason());
System.out.println(SPRING.toString());
SPRING.setSeason("XXX");
SPRING.setDesc("....");
}
}
class Season{
private String season;//季节
private String desc;//季节描述
public Season(String season,String desc){
this.season = season;
this.desc = desc;
}
public String getSeason() {
return season;
}
public void setSeason(String season) {
this.season = season;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
@Override//输出
public String toString() {
return "Season{" +
"season='" + season + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
我们可以创建对象来实例化类,此时在构造器公开的情况下我们可以无限创建对象,但是当我们的对象是被限制在一定范围内时,我们就不能随意设置对象和改变对象的属性,如一年只有四个季节,一年只有12个月等。
枚举的作用
当类的对象是有限的几个值且为只读不可修改时我们就需要设置为枚举类。
枚举的两种实现方式
- 自定义类实现
·不需要setXxx方法,将构造器私有化
·对枚举对象/属性使用final+static共同修饰,实现底层优化
·枚举对象名通常使用全部大写,即常量的命名规范
·枚举对象根据需要,也可以有多个属性
public class Enumeration {
public static void main(String[] args) {
System.out.println(SeasonEnum.AUTUMN);
}
}
//自定义实现枚举类
class SeasonEnum{
private String season;//季节
private String desc;//季节描述
//在类内部直接创建固定的对象
public static SeasonEnum SPRING = new SeasonEnum("春天","春色满园");
public static SeasonEnum SUMMER = new SeasonEnum("夏天","蛙声蝉鸣");
public static SeasonEnum AUTUMN = new SeasonEnum("秋天","叶落风寒");
public static SeasonEnum WINTER = new SeasonEnum("冬天","梅花点点");
//加入final修饰优化
/*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 SeasonEnum(String season,String desc){
this.season = season;
this.desc = desc;
}
public String getSeason() {
return season;
}
public String getDesc() {
return desc;
}
@Override//输出
public String toString() {
return "Season{" +
"season='" + season + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
注意:
当构造器私有化以后,main方法将不能再创建对象(即new)
去掉SetXxx相关的方法,使属性只能读不能修改
在类内部直接创建固定的对象
- 使用enum关键字实现
·使用关键字enum替代class
·对象语句只需写为-常量名(实参列表)-即可,如
public final static SeasonEnum SPRING = new SeasonEnum("春天","春色满园");——>
SPRING("春天","春色满园")
·先实例化再定义
即要求将定义常量对象名写在前面
·如果有多个常量(对象),使用“,”隔开,如
SPRING("春天","春色满园"), SUMMER("夏天","蛙声蝉鸣"),WHAT;
加入使用“;”则会报错
//根据关键字Enum关键字实现枚举类
enum SeasonEnum{
// //在类内部直接创建固定的对象
// public final static SeasonEnum SPRING = new SeasonEnum("春天","春色满园");
// public final static SeasonEnum SUMMER = new SeasonEnum("夏天","蛙声蝉鸣");
// public final static SeasonEnum AUTUMN = new SeasonEnum("秋天","叶落风寒");
// public final static SeasonEnum WINTER = new SeasonEnum("冬天","梅花点点");
SPRING("春天","春色满园"), SUMMER("夏天","蛙声蝉鸣");
private String season;//季节
private String desc;//季节描述
//构造器私有化
private SeasonEnum(String season,String desc){
this.season = season;
this.desc = desc;
}
public String getSeason() {
return season;
}
public String getDesc() {
return desc;
}
@Override//输出
public String toString() {
return "Season{" +
"season='" + season + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
枚举类注意事项
·当我们使用enum关键字来开发一个枚举类时,默认会继承Enum类(具体证实请看视频)(即所有的enum类都是Enum类的子类)
·常量名(实参列表)调用的是哪个构造器依据实参列表来判断
·如果使用无参构造器创建枚举对象,则实参列表和小括号都可以省略,如(代码里的WHAT)
SPRING("春天","春色满园"), SUMMER("夏天","蛙声蝉鸣"),WHAT;
private String season;//季节
private String desc;//季节描述
private SeasonEnum(){//无参构造器
}
//构造器私有化
private SeasonEnum(String season,String desc){
this.season = season;
this.desc = desc;
}
·当有多个枚举对象时,使用“,”间隔,最后有一个分号结尾
·枚举对象必须放在枚举类的行首(即先实例化再定义)
在使用关键字enum时,会隐式基础Enum类,这样我们就可以使用Enum类相关的方法。
枚举类常用方法
方法 | 功能 |
toString | 返回的是当前的枚举对象,子类可以重写该方法,用于返回对象的属性信息 |
name | 返回当前对象名(常量名),子类中不能重写 |
ordinal | 返回当前对象的位置号,默认从0开始 |
values | 返回一个包含当前枚举类中所有常量的数组 |
valueOf | 将字符串转换成枚举对象,要求字符串必须为已有的常量名,否则报异常 |
compareTo | 比较两个枚举常量,比较的是位置号 |
public class EnumMethod {
public static void main(String[] args) {
SeasonEnum seasonEnum = SeasonEnum.SPRING;
//父类的toString方法返回当前对象名
System.out.println(seasonEnum.toString());
//返回枚举对象名
System.out.println(seasonEnum.name());
//返回当前对象的位置号,默认从0开始,所谓的位置号即当前对象在枚举类内的固定对象里是第几个(从0开始)
System.out.println(seasonEnum.ordinal());
//返回一个包含当前枚举类中所有常量的数组
SeasonEnum[] values = SeasonEnum.values();
for (SeasonEnum seasonEnum1: SeasonEnum.values()){//增强for循环
System.out.println(seasonEnum1);
}
//将字符串(即枚举类内以及创建的对象)转换成枚举对象,要求字符串必须为已有的常量名,否则报异常
SeasonEnum seasonEnum1 = SeasonEnum.valueOf("SPRING");//此时seasonEnum1对象与对象seasonEnum相同
System.out.println("seasonEnum1 = " + seasonEnum1);//输出的是toString
//比较两个枚举常量,比较的是位置号(即ordinal()方法得到的位置号
//SeasonEnum.SPRING.compareTo(SeasonEnum.SUMMER)就是把SeasonEnum.SPRING枚举对象的编号与SeasonEnum.SUMMER枚举对象的编号进行比较
//compareTo()方法源码里返回的是return self.ordinal - other.ordinal;
System.out.println(SeasonEnum.SPRING.compareTo(SeasonEnum.SUMMER));
}
}