一.枚举的实现原理
定义一个简单的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() + "、");
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/130222.html