深入java虚拟机——enum本质

来源:互联网 发布:sql server 许可证 编辑:程序博客网 时间:2024/05/01 15:28
自从看了java虚拟机,就一直想对java的一些特性进行更深入的了解。想弄清楚这些特性在虚拟机的层面到底是怎么实现的。通过自定义一个enum类型,然后查看编译后的class文件。发现了如下几件事情。
      1.自定义一个enum类型本质上定义了一个java.lang.Enum的一个子类。如以下代码:
与public enum Color {RED,GREEN}等价的类为public class Color extends Enum<
Color >{
public static final Color RED=new Color("RED",0);
public static final Color GREEN=new Color("GREEN",1);
public Color(String name,int ordinal){
super(name,ordinal);
}
}
     2.是用enum定义一个类型时,就是定义了一个继承了java.lang.Enum的一个子类,一个Enum实例内部有两个属性,name和ordinal,一个构造方法 Enum(String name,int ordinal);Enum的toString方法返回的即name属性。所以 System.out.println(Color.RED);打印“RED”就不足为奇了。
     3.如果我们在enum要定义若干常量列表(其实是必然的,我们定义enum类型的目的正在于此),比如上面的RED、GREEN,必须放在类开始处,也就是说如下的形式是不合法的。
public enum Color {
some code//some code为一些方法或者字段定义。
RED,GREEN} 
    4.编译器会为我们自定义的enum类型生成两个方法。其中一个方法如下:
public static Color valueOf(String name);//根据name得到对应的Color对象,比如传入"RED",返回RED
    5.既然enum本质是一个class,自然可以任意定义属性和方法了,不过我们一般没有这么做的必要。同时这个class有其特殊之处,
 比如构造方法不能有访问修饰符(其实编译为其自动生成私有访问属性)