java枚举,我称之为全网最强教程
2025-05-01 09:12 阅读(5)

文章来源: 我的微信公众号:程序员老左,欢迎关注和留言,后面会定期更新



什么是枚举?


  枚举是Java 5引入的一种特殊数据类型,用于定义一组固定的常量,在结构上和类很相似。枚举类型可以帮助我们组织和管理相关的常量,使得代码更加清晰、可读性更强。例如表示一周的天数、表示颜色、表示状态等等。


定义枚举

public enum Day {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
  }

使用枚举


Day day = Day.MONDAY;

通过枚举名称直接引用相关的常量,有点像类的静态属性。


常用用法是配合switch使用

Day day = Day.MONDAY;
        switch (day){
            case MONDAY:
                System.out.println("星期一");
                break;
            case TUESDAY:
                System.out.println("星期二");
                break;

        }

枚举比较


Day day = Day.MONDAY;
  if(day == Day.MONDAY){
            System.out.println(true);
        }else{
            System.out.println(false);
        }
   输出:
     true

枚举中定义的常量到底是啥?


  枚举和类可以说非常相似,或者也可以称为具有特定限制的类。它的每一个常量都是一个对象(实例),都是一个事先创建好的对象。MONDAY是对象,TUESDAY也是对象,其余的都是对象。当使用Day.MONDAY时,实际上是引用MONDAY对象。


  这也就是为什么枚举常量可以通过==来判断是否相等

Day day = Day.MONDAY;
        Day day2 = Day.MONDAY;
        if(day == day2){
            System.out.println(true);
        }else{
            System.out.println(false);
        }
   输出:
     true

因为day和day2引用的是同一个对象




构造方法


  既然可以实例化对象,那么就应该有构造对象的构造方法,如果不定义构造方法,默认情况下,会使用默认的无参的构造方法:


private Day(){

   }

public enum Day {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY;

    private Day(){
        System.out.println("实例化:"+this);
    }
}

注意SUNDAY后面要加";",而且构造方法必须是private,因为不允许我们自己创建对象。


当程序中没有用到该枚举时,不会为常量创建枚举对象,一旦用到就自动创建对象:


MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY


比如,如下程序:

public static void main(String[] args) {
        Day day = Day.MONDAY;
    }

当运行到Day.MONDAY时,会触发构造方法,为每一个枚举常量都创建对象,输出:


实例化:MONDAY
实例化:TUESDAY
实例化:WEDNESDAY
实例化:THURSDAY
实例化:FRIDAY
实例化:SATURDAY
实例化:SUNDAY

枚举属性


  可以创建对象,理论上也可以让对象存在属性。比如给枚举加一个


description属性


public enum Day {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY;

    private Day(){
        System.out.println("实例化:"+this);
    }

    public String description = null;
}

修改MONDAY常量对象的属性:



Day.MONDAY.description = "星期一";
System.out.println(Day.MONDAY.description);
输出:星期一

此时,其他常量


(TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY)的description属性仍为null。




枚举方法


  同样,也可以创建方法:

public void setDescription(String description){
        this.description = description;
    }

使用枚举方法:


修改MONDAY对象的description属性

Day.MONDAY.setDescription("星期一");

带参数的构造方法


  由于有属性的存在,往往需要通过构造方法给属性赋值,那么就需要定义带参的构造方法:


private Day(String s){
        this.description = s;
    }

此时,枚举常量就可以通过构造方法给description属性赋值:


    MONDAY("星期一"),
    TUESDAY("星期二"),
    WEDNESDAY("星期三"),
    THURSDAY("星期四"),
    FRIDAY("星期五"),
    SATURDAY("星期六"),
    SUNDAY("星期日");

从这里可以看出,枚举常量实际上相当于Day类的:


public static Day MONDAY = new Day("星期一");

重写方法


每一个枚举常量都可以重写枚举已经定义的方法:


MONDAY("星期一"){
        public void setDescription(String description){
            this.description = "今天是:" + description;
        }
    }

枚举遍历


可以使用values()方法遍历枚举中的所有常量:


for (Day day : Day.values()) {
    System.out.println(day);
}
输出:
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY

valueOf方法


valueOf(String name):根据名称返回对应的枚举常量。


Day day = Day.valueOf("MONDAY");