Java枚举(Enum)详细讲解与使用

枚举

在Java中枚举是指一种特殊的类。特殊在这个类的对象是固定的、有限的、几个常量对象

在Java5之前

package com.gj.jdk5.before;

import java.util.Objects;

/*
保证无论谁来使用Week类,只能从它7个对象中选一个,不能有其他对象。
思考:
(1)new对象要用到构造器 => 对构造器做限制,加private
(2)如何给外面准备好7个对象
 */
public class Week {
    //public:公开
    //static:表示外面可以通过“类名.MONDAY”进行使用
    //final:不可修改
    public static final Week MONDAY = new Week(1,"星期一");
    public static final Week TUESDAY = new Week(2,"星期二");
    public static final Week WEDNESDAY = new Week(3,"星期三");
    public static final Week THURSDAY = new Week(4,"星期四");
    public static final Week FRIDAY = new Week(5,"星期五");
    public static final Week SATURDAY = new Week(6,"星期六");
    public static final Week SUNDAY = new Week(7,"星期日");

    //建议枚举对象的属性也加final
    private final int value;
    private final String description;

/*    private Week(){

    }*/
    private Week(int value,String description){
        this.value = value;
        this.description = description;
    }

    public int getValue() {
        return value;
    }

    public String getDescription() {
        return description;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Week week = (Week) o;
        return value == week.value && Objects.equals(description, week.description);
    }

    @Override
    public int hashCode() {
        return Objects.hash(value, description);
    }

    @Override
    public String toString() {
        return "Week{" +
                "value=" + value +
                ", description='" + description + '\'' +
                '}';
    }
}

package com.gj.jdk5.before;

public class TestWeek {
    public static void main(String[] args) {
        //想要星期一的对象
        Week m1 = Week.MONDAY;
        //想要星期二的对象
        Week m2 = Week.THURSDAY;

        //再次获取星期一的对象
        Week m3 = Week.MONDAY;

        System.out.println(m1 == m3);//true
        System.out.println(m1 == m2);//false

        System.out.println(m1);
    }
}

在Java5之后

在这里插入图片描述

语法:

【修饰符】 enum 枚举类名{
    常量对象列表;
    
    其他成员
}

注意:

  • 枚举类的常量对象列表必须在首行
  • 枚举类的构造器一定private(因为要隐藏外界new对象),private可以省略,而且也不能写别的权限修饰符。
  • 枚举类没有子类,因为它的构造器私有化了,子类无法调用。
  • 枚举类不能指定其他父类,它有一个固定父类Enum。

在这里插入图片描述

案例:

package com.gj.jdk5.after;

//class:是普通类
//enum:是枚举类,是特殊的类
public enum Week {
    //常量对象列表,必须在枚举类首行
    MONDAY(1,"星期一"),
    TUESDAY(2,"星期二"),
    WEDNESDAY(3,"星期三"),
    THURSDAY(4,"星期四"),
    FRIDAY(5,"星期五"),
    SATURDAY(6,"星期六"),
    SUNDAY(7,"星期日");

    //建议枚举对象的属性也加final
    private final int value;
    private final String description;

    //构造器前面省略了private
    Week(int value, String description) {
        this.value = value;
        this.description = description;
    }

    public int getValue() {
        return value;
    }

    public String getDescription() {
        return description;
    }

    @Override
    public String toString() {
        return "Week{" +
                "value=" + value +
                ", description='" + description + '\'' +
                "} " + super.toString();
    }

}

创建测试类

package com.gj.jdk5.after;

public class TestWeek {
    public static void main(String[] args) {
        //获取星期一对象
        Week m1 = Week.MONDAY;
        System.out.println(m1);

        Week m2 = Week.MONDAY;
        System.out.println(m2);

        System.out.println(m1 == m2);//true
        System.out.println(m1.equals(m2));//true
    }
}

枚举类的方法

  • public final String name():用于返回枚举对象的常量对象名
  • public final int ordinal():用于返回枚举对象的下标
  • public static 枚举类型[] values():用于返回当前枚举类的所有常量对象
  • public static 枚举类型 valueOf(String 常量对象名):根据常量对象名获取常量对象。
  • public String toString():Enum父类中默认返回的是常量对象名,自己的枚举类可以重写toString。
  • public boolean equals(Object obj)和 public int hashCode():枚举类中这两个方法不需要也不能重写,因为枚举类的对象是固定的几个常量对象,它们比较相等就用地址值比较即可。Object类中equals就是等价于==

举例

package com.gj.jdk5.after;

import java.util.Scanner;
//创建测试类
public class TestMethod {
    public static void main(String[] args) {
        Week w1 = Week.MONDAY;
        System.out.println(w1.name());
        System.out.println(w1.ordinal());

        Week w2 = Week.FRIDAY;
        System.out.println(w2.name());
        System.out.println(w2.ordinal());

        Week[] all = Week.values();
        for (Week w : all) {
            System.out.println(w);
        }

        System.out.println(Week.values()[2]);//获取星期三

        System.out.println("==================");
//        从键盘输入星期对象的名称,然后从Week类中获取该对象
        Scanner input = new Scanner(System.in);

        System.out.print("请输入星期的单词:");
        String name = input.next();
//        System.out.println("name = " + name);
        //可以把字符串自动转为大写
        name = name.toUpperCase();//把字符串的单词转为大写
//        System.out.println("name = " + name);

        Week week = Week.valueOf(name);
        System.out.println(week);

        input.close();
    }
}

switch在Java5开始支持枚举

switch支持哪些类型?4种基本数据类型(byte,short,char,int)及其对应的包装类,枚举,字符串String。

package com.gj.jdk5.after;

import java.util.Scanner;

public class TestSwitch {
    public static void main(String[] args) {
        //从键盘输入星期的单词,从Week类中获取对应的星期对象
        //如果星期对象是MONDAY,那么就输出这是最痛苦的一天
        //....
        Scanner input = new Scanner(System.in);
        System.out.print("请输入星期的单词:");
        String name = input.next();
        //可以把字符串自动转为大写
        name = name.toUpperCase();//把字符串的单词转为大写

        Week week = Week.valueOf(name);
        System.out.println(week);

        switch (week){
            case MONDAY -> System.out.println("这是最痛苦的一天1");
            case TUESDAY -> System.out.println("这是最痛苦的一天2");
            case WEDNESDAY -> System.out.println("这是最痛苦的一天3");
            case THURSDAY -> System.out.println("这是最痛苦的一天4");
            case FRIDAY -> System.out.println("这是最痛苦的一天5");
            case SATURDAY -> System.out.println("这是最痛苦的一天6");
            case SUNDAY -> System.out.println("这是最开心的一天");
        }


        input.close();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值