首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Java 中很奇异的枚举

2012-11-10 
Java 中很怪异的枚举反编译了一个文件,得到如下代码:??public final class Gender extends Enum{public st

Java 中很怪异的枚举

反编译了一个文件,得到如下代码:

?

?

public final class Gender extends Enum{    public static final Gender Male;    public static final Gender Female;    public static final Gender Unknown;    private static final Gender $VALUES[];    public static Gender[] values()    {        return (Gender[])$VALUES.clone();    }    public static Gender valueOf(String s)    {        return (Gender)Enum.valueOf(Gender, s);    }    private Gender(String s, int i)    {        super(s, i);    }    static     {        Male = new Gender("Male", 0);        Female = new Gender("Female", 1);        Unknown = new Gender("Unknown", 2);        $VALUES = (new Gender[] {            Male, Female, Unknown        });    }}
?

再用这个类重新编译的时候,发生了语法错误,说 Enum 不能被直接继承。 classes cannot directly extends java.lang.Enum 这样的错误提示。

搞晕了。 通过各种手段, Goolge 到如下这篇文章,才得以释然。

于是乎,写了几句话:

?

public enum Gender{Male,Female,Unknown;}

?编译成class 文件,再反编译回来,果真得到了文章开始的文件。

?

?

网上的这篇文章如下:

?

http://blog.csdn.net/meng72ndsc/article/details/5824434


1、创建一个枚举类

?

?

EnumDemo.javapublic enum EnumDemo {}
?

2、我们来猜测一下这个枚举类?

2.1、查看它的字节码文件

?

Compiled from "EnumDemo.java"public final class EnumDemo extends java.lang.Enum{public static EnumDemo[] values();public static EnumDemo valueOf(java.lang.String);static {};}
?

final keyword:表明一个枚举类是一个终止(final)类,说明它不能作为父类,也就是说它没有子类,还说明它不能是一个抽象类。

extends keyword:表明一个枚举类默认就是继承自java.lang.Enum,是它的子类,由于java类只能是单继承,所以我们不能再自己写一个extends来继承自其它的某一个 类。

两个静态的方法:values():它的返回类型是EnumDemo[], 返回一个包含全部枚举值的数组。
valueOf(java.lang.String):这个方法和toString方法是相对应的,返回带指定名称的指定枚举类型的枚举常量。
静态块:static{},当枚举类被调用的时候就将静态块里面的东西加载到内存。
2.2、枚举能实现某一个接口吗?

Machine.javapublic interface Machine {void run();}SubClass.javapublic enum SubClass implements Machine {;public void run() {}}
?

编译能通过。
再来看一下SubClass.java的字节码内容:

?

Compiled from "SubClass.java"public final class SubClass extends java.lang.Enum implements Machine{public static SubClass[] values();public static SubClass valueOf(java.lang.String);public void run();static {};}
?

很有意思的是:在SubClass.java中有一个不起眼的分号";",别看它不起眼,如果你不写这个分号就会出现错误,";"代表着枚举值的声明完毕。那么什么叫做枚举值呢?
枚举值:

?

public enum SubClass implements Machine {A, B("HELLO WORLD"), C;private SubClass() {}private SubClass(String s) {}public void run() {}}
?


它的字节码文件:

?

Compiled from "SubClass.java"public final class SubClass extends java.lang.Enum implements Machine{public static final SubClass A;public static final SubClass B;public static final SubClass C;public static SubClass[] values();public static SubClass valueOf(java.lang.String);public void run();static {};}
?

这会儿知道为什么A,B,C要大写了吧?
在这个枚举类当中,A 和B("HELLO WORD") 和 C 都是枚举值。它们之所以能产生,是因为有相对应的构造函数的缘故,如果你不相信,那么你可以将任意一个构造函 数删除,试一下。我们要学会成为破坏高手,现在我将private SubClass(){}删除,对了,在枚举里面的构造方法必须是私有的,但是我试了以下,默认的也行,不知道是谁说的必须是私有的,但是大家都是这样做 的,我也就这样说了。我们还是回到正题:
错误:找不到符号
符号:构造函数SubClass()
位置:类SubClass
好了,就说到这里,下面我来完整的体验一下,看看会出现一些什么问题:

热点排行