写在前面:
视频是什么东西,有看文档精彩吗?
视频是什么东西,有看文档速度快吗?
视频是什么东西,有看文档效率高吗?
1. 问题
诸小亮:之前我们说过,Java中用 class 来描述世间万物
张小飞:没错,我记得很清楚
“现在给你一个任务,写一个 Class 描述星期(周一到周日) ”
“这简单”
class Week{
String name;
int value;
String description;
}
“而且,周一到周日的对象,都给你创建好,比如:”
public static void main(String[] args) throws IOException {
Week one = new Week("星期一",1,"睡不醒");
Week two = new Week("星期二",2,"还在睡");
Week three = new Week("星期三",3,"干活");
Week four = new Week("星期四",4,"摸鱼");
Week five = new Week("星期五",5,"兴奋");
Week six = new Week("星期六",6,"狂欢");
Week seven = new Week("星期日",7,"通宵");
}
诸小亮:上面代码,存在一些问题
张小飞:别开玩笑了,这有什么问题?
“表面看起来没有问题,但 Week 是一个类,理论上可以创建无数个对象,比如:”
上图,现实中是不存在 ‘星期八’的,但依然可以通过Week创建这个对象,这明显不正确
张小飞:那就说明 Class 并不能描述所有事物?
诸小亮:准确来说,一般的 class 并不能描述所有事物,这种情况就可以使用——枚举
2. Enum
1. 介绍
诸小亮:枚举,英文 Enum,就是一个个列出来的意思
- 这是一种特殊的 class,构造函数私有(不允许创建对象)
- 它的对象,都在类的内部定义
适用场景:当某种事物只有固定的几个对象时,可以使用 Enum,比如:
比 如:星期一到星期日、一年的12个月、一天的24小时。。。。。
2. 定义
张小飞:具体怎么使用呢?
诸小亮:定义一个枚举类非常简单,格式:
public enum 枚举类类名 {
//成员变量
//成员方法
}
“特殊的地方在于,它的对象是定义在类中的,比如:”
public enum Week{
//1. Week的对象,多个之间逗号分割,一般一行一个,MONDAY就是对象名
MONDAY("星期一",1,"起不来"),
TUESDAY("星期二",2,"起不来"),
WEDNESDAY("星期三",3,"起不来"),
THURSDAY("星期四",4,"起不来"),
FRIDAY("星期五",5,"起不来"),
SATURDAY("星期六",6,"起不来"),
SUNDAY("星期日",7,"起不来");
//2. 构造方法,注意:参数顺序跟上面的对象一一对应
Week(String name, int value, String description) {
this.name = name;
this.value = value;
this.description = description;
}
//3. 成员变量
private String name;
private int value;
private String description;
//4. 成员方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
张小飞:原来这就是枚举,不过,定义好的对象应该怎么使用呢?
3. 使用
1. 设置属性
诸小亮:特别简单,就像使用静态变量一样,比如:
public static void main(String[] args) throws IOException {
//1. 设置属性,但是一般不会修改
Week.FRIDAY.setDescription("要放假啦");
//2. 读取属性
System.out.println(Week.FRIDAY.getDescription());
}
结果:
张小飞:就这样?
诸小亮:是的,不过还有两个特殊的方法
System.out.println(Week.FRIDAY.name());//1. 获取对象名称
System.out.println(Week.FRIDAY.ordinal());//2. 获取对象的默认序号,从 0 开始
张小飞:嗯?类中没有定义这两个方法吧
诸小亮:是的,这两个默认的方法,不用定义就可以使用
诸小亮:另外,ordinal()方法获取的序号是它在 Enum 中定义的位置,比如:
诸小亮:因此,Week.FRIDAY.ordinal() 的结果是:4
张小飞:那如果有人修改了 FRIDAY 对象的位置,结果是不是就变了
诸小亮:是的,所以一般不建议使用 ordinal 方法,因为总有人修改它的位置
张小飞:明白了
2. 根据名称获取对象
诸小亮:根据对象名也可以获取对应的枚举对象,比如:
Week week = Week.valueOf("MONDAY");//注意:MONDAY必须在枚举中存在
System.out.println(week);//默认输出对象名称
结果:
张小飞:那如果,并没有定义这个对象呢?比如:EIGHT
诸小亮:如果枚举中不存在这个对象,就会报错:
3. values()拿到所有对象
诸小亮:通过 values() 方法,可以获取所有枚举对象,比如:
Week[] values = Week.values();
for(Week w : values){
System.out.println(w.getName()+"------"+w.ordinal());//ordinal()返回对象的序号,从0开始
}
结果: