张小飞的Java之路——第十四章——枚举

文章通过对话形式介绍了Java中的枚举类型(Enum)。枚举用于描述固定数量的对象,如星期一到星期日。相比于普通的class,枚举不允许创建额外的对象,防止了像“星期八”这样的错误。枚举的定义包括对象名、构造方法、成员变量和方法。文章还展示了如何设置和获取枚举对象的属性,以及使用valueOf方法根据名称获取对象和values方法获取所有枚举对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面:

视频是什么东西,有看文档精彩吗?

视频是什么东西,有看文档速度快吗?

视频是什么东西,有看文档效率高吗?


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 是一个类,理论上可以创建无数个对象,比如:”

image.png
上图,现实中是不存在 ‘星期八’的,但依然可以通过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());
}

结果:image.png

张小飞:就这样?

诸小亮:是的,不过还有两个特殊的方法

System.out.println(Week.FRIDAY.name());//1. 获取对象名称
System.out.println(Week.FRIDAY.ordinal());//2. 获取对象的默认序号,从 0 开始

张小飞:嗯?类中没有定义这两个方法吧

诸小亮:是的,这两个默认的方法,不用定义就可以使用

诸小亮:另外,ordinal()方法获取的序号是它在 Enum 中定义的位置,比如:

image.png
诸小亮:因此,Week.FRIDAY.ordinal() 的结果是:4

张小飞:那如果有人修改了 FRIDAY 对象的位置,结果是不是就变了

诸小亮:是的,所以一般不建议使用 ordinal 方法,因为总有人修改它的位置

张小飞:明白了

2. 根据名称获取对象

诸小亮:根据对象名也可以获取对应的枚举对象,比如:

Week week = Week.valueOf("MONDAY");//注意:MONDAY必须在枚举中存在
System.out.println(week);//默认输出对象名称

结果:image.png

张小飞:那如果,并没有定义这个对象呢?比如:EIGHT

诸小亮:如果枚举中不存在这个对象,就会报错:

image.png

3. values()拿到所有对象

诸小亮:通过 values() 方法,可以获取所有枚举对象,比如:

Week[] values = Week.values();
for(Week w : values){
    System.out.println(w.getName()+"------"+w.ordinal());//ordinal()返回对象的序号,从0开始
}

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值