枚举

  • 枚举是一个特殊的类,一般表示一组常量,比如一年的四个季节,一年的十二个月份,一星期的七天,方向有东南西北
  • 枚举可以有构造函数,实例化变量,方法,甚至可以实现接口
  • 枚举不使用new关键字实例化
  • 默认情况下,所有的枚举都继承 java.lang.Enum类

自定义枚举

  1. 不需要提供setXxx方法,防止属性被修改,因为枚举的对象值通常为只读
  2. 对枚举对象/属性使用final+static共同修饰,实现底层优化

    1. 仅将变量声明为静态可能会导致其值被声明它的类的一个或多个实例更改。
    2. 将它们声明为 static final 将帮助您创建一个CONSTANT。仅存在一份无法重新初始化的变量副本
  3. 枚举对象名通常使用全部大写,常量的命名规范
  4. 枚举对象根据需要,也可以有多个属性
public class Enumeration {
    public static void main(String[] args) {
        System.out.println(Season.spring);
        System.out.println(Season.summer);
        System.out.println(Season.autumn);
        System.out.println(Season.winter);
    }
}
class Season{
    private  String name;
    private  String desc;
    //定义固定的对象   static final(常量) 静态的最终的
    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("冬天","寒冷");
    //构造器私有化,防止直接new
    private Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }
    //去掉set方法,防止属性被修改
    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

    @Override
    public String toString() {
        return "Season{" +
                "name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}

enum关键字实现枚举

public class Enumeration {
    public static void main(String[] args) {
        System.out.println(Season.spring);
        System.out.println(Season.summer);
        System.out.println(Season.autumn);
        System.out.println(Season.winter);
    }
}
enum  Season{
   spring ("春天","温暖"),summer("夏天","炎热"),autumn("秋天","凉爽"),winter("冬天","寒冷");
    private  String  name;
    private  String desc;
    private Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

   public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

    @Override
    public String toString() {
        return "Season{" +
                "name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}

Season反编译结果

反编译

  • 当我们使用enum关键字开发一个枚举类时,默认会 继承Enum类而且是一个final类(可通过反编译看出)
  • 传统的public static final Season spring =new Season("春天","温暖");简化成spring("春天","温暖");

    • 诚然,你要看清楚它调用的是哪个构造器
  • 如果使用无参构造器创建枚举对象,则实参列表和小括号都可以省略
  • 多个枚举对象时,使用逗号间隔,最后一个对象分号结尾
  • 枚举对象必须放在枚举类的行首

枚举练习题

enum Gender {
    BOY,GIRL; //这里调用的是默认无参构造器
}
Gender boy =Gender.BOY;
Gender boy_2=Gender.BOY;
//输出Gender枚举中的BOY对象,输出对象找tostring方法
//显然该枚举中并没有重写tostring方法,可反编译得知,枚举 Gender调用了它的父类Enum类,
//Enum类的tostring返回的是name
/*
public String toString(){    //可看ENUM底层源码
    return name;
} 
**/
 System.out.println(boy); 


 System.out.println(boy=boy_2); //同一个对象,指向了两个不同的引用,当然相等

枚举常用方法(去看api,去看底层源码)

  • toString():Enum类已经重写过了,返回的是当前对象名,眦裂可以重写该方法,用于返回对象的属性信息
  • name():返回当前对象名(常量名),子类中不能重写

    • 关于是使用name()还是toString()
    • Enum子类中的toString如果不重写的话就是继承了父类Enum重写过Object类中toString,它是可以被子类重写的
    • name()方法是一种final方法,它是不能被重写的
    • 如果您需要字段本身的名称,请使用name(). 如果您需要字段值的字符串表示形式,请使用toString().
    • 当您想向用户(包括查看日志的开发人员)呈现信息时,请使用toString( )。永远不要在你的代码中依赖于toString()给出一个特定的值。切勿针对特定字符串对其进行测试。如果您的代码在有人正确更改toString()返回时中断,那么它已经被破坏了。
    • 如果您需要获取用于声明枚举常量的确切名称,您应该使用 name() 因为 toString 可能已被覆盖。
  • ordinal():返回该枚举对象的的次序/编号,从0开始编号
  • values():返回当前枚举类中的常量
  • valueOf():将字符串转换成枚举对象,要求字符串必须为已有的常量名,否则报异常!
  • compareTo():比较两个枚举常量,比较的就是编号
public class Enumeration {
    public static void main(String[] args) {
        System.out.println(Season.spring);
        System.out.println(Season.summer);
        System.out.println(Season.autumn);
        System.out.println(Season.winter);
        Season Spring=Season.spring;
        //以类名访问对象常量,toString
        System.out.println(Season.spring);
        //输出对象名, toString
        System.out.println(Spring);
        //调用name()
        System.out.println(Spring.name());
        //输出该枚举对象的的次序/编号,从0开始编号
        System.out.println(Spring.ordinal());
        //values,含有所有的枚举对象
        Season[] values = Season.values(); //Season.values().var直接生成
        //for循环输出
        for (Season value : values) {      //values.for直接生成
            System.out.println(value);
            //valueOf(),根据你输入的字符串到Season的枚举对象去查找,找到了返回,没找到就报错
            Season season = Season.valueOf("spring");
            System.out.println(season);
           //以下判断是证明,查找成功后返回的是枚举对象
            System.out.println(Spring==season);
            //compareTo(),比较的是编号
            System.out.println(Season.spring.compareTo(Season.summer));
        }
    }
}
enum  Season{
   spring("春天","温暖"),summer("夏天","炎热"),autumn("秋天","凉爽"),winter("冬天","寒冷");
    private  String  name;
    private  String desc;
    private Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

   public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }
    
}
最后修改:2022 年 04 月 09 日 04 : 23 PM