首先,我举个例子,做个试验来共同探讨。看下面的代码:
1、我先定义一个枚举Size将这段代码保存为Size.java文件
2、接着编译这段代码生成Size.class文件
3、接着使用java反编译工具jad.exe文件反编译Size.class文件,生成Size.jad文件
4、用记事本打开Size.jad文件,以下是Size.jad文件的内容:
- // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
- // Jad home page: http://www.kpdus.com/jad.html
- // Decompiler options: packimports(3)
- // Source File Name: Enum.java
- final class Size extends Enum//发现Size居然继承了Enum类,并且修饰符是final
- {
- public static Size[] values()//Size居然有方法
- {
- return (Size[])$VALUES.clone();
- }
- public static Size valueOf(String s)//查阅API可知该方法覆盖了Enum类的方法
- {
- return (Size)Enum.valueOf(Size, s);
- }
- private Size(String s, int i)//Size居然有构造函数,调用了超类构造函数
- {
- super(s, i);
- }
- public static final Size A;//原来里面的枚举变量也属于Size类型,怪不得可以使用Size s = Size.A;
- public static final Size B;
- public static final Size C;
- private static final Size $VALUES[];//也生成了这个东西
- static //在static初始化块中给枚举变量赋值,调用了构造方法
- {
- A = new Size("A", 0);
- B = new Size("B", 1);
- C = new Size("C", 2);
- $VALUES = (new Size[] {
- A, B, C
- });
- }
- }
复制代码 5、从以上例子我们可以看出,java实际上底层使用了类来实现枚举
6、以下是《java核心技术》中的讲解
A、所有的枚举类型都是java.lang.Enum类的子类
B、比较两个枚举类型值时不需要用equals(),用"=="就可以了
C、在JDK5中可以像下面这样使用枚举- enum Size{
- SMALL("S"),MEDIUM("M"),LARGE("L");
- Size(String str)//
- {
- this.str=str;
- }
- private String str;
- }
复制代码 7、根据以上回答,我很想知道jdk7以前的switch语句能不能判断一个内部值是String的枚举变量?求验证? |