java中Enum详解

一.枚举的实现原理

定义一个简单的Enum,如下所示:

public enum Sex {
    MALE("男"),FEMALE("女");

    private String desc;

    Sex(String desc) {
        this.desc = desc;
    }
}

反编译后,如下:

public final class Sex extends Enum
{

    public static Sex[] values()
    {
        return (Sex[])$VALUES.clone();
    }

    public static Sex valueOf(String s)
    {
        return (Sex)Enum.valueOf(com/zpengc/lang/Sex, s);
    }

    private Sex(String s, int i, String s1)
    {
        super(s, i);
        desc = s1;
    }

    public static final Sex MALE;
    public static final Sex FEMALE;
    private String desc;
    private static final Sex $VALUES[];

    static 
    {
        MALE = new Sex("MALE", 0, "\u7537");
        FEMALE = new Sex("FEMALE", 1, "\u5973");
        $VALUES = (new Sex[] {
            MALE, FEMALE
        });
    }
}

由此可知:
1.枚举本质上是通过普通的类来实现的,这个类继承了java.lang.Enum,只是编译器为我们进行了处理
2.每个枚举常量是一个静态常量字段,指向了新建的对象实例
3.类中添加了valueof、values方法,定义了$VALUES[]数组,保存了所有枚举常量
4.所有枚举常量都通过静态代码块来进行初始化,即在类加载期间就初始化,并且用final修饰,防止篡改
5.默认生成构造函数,包含枚举所有成员变量的同时,也包含了父类Enum的成员变量name,ordinal,例如:
在这里插入图片描述

二.枚举中定义抽象方法

理解了枚举的实现远离,就明白枚举本质上也是普通的类,除了可以实现接口外,还可以在枚举类中定义抽象方法,这样每个枚举的对象只要分别实现了此抽象方法即可,例如

enum Color{
    RED{
        public String getColor(){//枚举对象实现抽象方法
            return "红色";
        }
    },
    GREEN{
        public String getColor(){//枚举对象实现抽象方法
            return "绿色";
        }
    },
    BLUE{
        public String getColor(){//枚举对象实现抽象方法
            return "蓝色";
        }
    };
    public abstract String getColor();//定义抽象方法
}

public class Test{
    public static void main(String[] args) {
        for (Color c:Color.values()){
            System.out.print(c.getColor() + "、");
        }
    }
}

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
很高兴回答您关于Javaenum类型的问题。在Javaenum类型是一种特殊的数据类型,用于定义一组命名常量。下面是一个示例代码及详解: ```java public class EnumExample { // 定义一个enum类型 public enum Day { MONDAY("星期一"), TUESDAY("星期二"), WEDNESDAY("星期三"), THURSDAY("星期四"), FRIDAY("星期五"), SATURDAY("星期六"), SUNDAY("星期日"); private String chineseName; // 枚举常量的文名称 // 构造方法 Day(String chineseName) { this.chineseName = chineseName; } // 获取枚举常量的文名称 public String getChineseName() { return chineseName; } } public static void main(String[] args) { // 遍历枚举常量并输出文名称 for (Day day : Day.values()) { System.out.println(day + ":" + day.getChineseName()); } } } ``` 在上述代码,我们定义了一个名为`Day`的enum类型。该enum类型包含了一组枚举常量,分别代表一周的不同天。每个枚举常量都有一个关联的文名称,通过构造方法传递并保存在`chineseName`字段。 在`main`方法,我们使用`Day.values()`方法获取所有枚举常量,并通过增强型`for`循环遍历每个枚举常量。在循环,我们打印出每个枚举常量的名称和对应的文名称。 运行以上代码,您将会看到以下输出: ``` MONDAY:星期一 TUESDAY:星期二 WEDNESDAY:星期三 THURSDAY:星期四 FRIDAY:星期五 SATURDAY:星期六 SUNDAY:星期日 ``` 通过使用enum类型,我们可以定义一组具有固定值的常量,并且可以为每个常量添加其他属性和方法。这使得代码更加清晰、可读性更高,并且在编译期间会进行类型检查,避免了一些错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值