黑马程序员技术交流社区

标题: 对于枚举的理解 [打印本页]

作者: 唐永康    时间: 2012-11-17 23:07
标题: 对于枚举的理解

对于枚举的理解,枚举相当于一个类,而枚举里面的大写常量就相当于一个枚举类的对象,不知道这样理解对不对,总感觉这样理解有些别扭,谁能更深入的理解,求教。
作者: 奚华    时间: 2012-11-18 00:00
首先,我举个例子,做个试验来共同探讨。看下面的代码:
1、我先定义一个枚举Size
  1. enum Size
  2. {
  3.         A,B,C
  4. }
复制代码
将这段代码保存为Size.java文件
2、接着编译这段代码
  1. javac Size.java
复制代码
生成Size.class文件
3、接着使用java反编译工具jad.exe文件反编译Size.class文件,生成Size.jad文件
4、用记事本打开Size.jad文件,以下是Size.jad文件的内容:

  1. // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
  2. // Jad home page: http://www.kpdus.com/jad.html
  3. // Decompiler options: packimports(3)
  4. // Source File Name:   Enum.java


  5. final class Size extends Enum//发现Size居然继承了Enum类,并且修饰符是final
  6. {

  7.     public static Size[] values()//Size居然有方法
  8.     {
  9.         return (Size[])$VALUES.clone();
  10.     }

  11.     public static Size valueOf(String s)//查阅API可知该方法覆盖了Enum类的方法
  12.     {
  13.         return (Size)Enum.valueOf(Size, s);
  14.     }

  15.     private Size(String s, int i)//Size居然有构造函数,调用了超类构造函数
  16.     {
  17.         super(s, i);
  18.     }

  19.     public static final Size A;//原来里面的枚举变量也属于Size类型,怪不得可以使用Size s = Size.A;
  20.     public static final Size B;
  21.     public static final Size C;
  22.     private static final Size $VALUES[];//也生成了这个东西

  23.     static //在static初始化块中给枚举变量赋值,调用了构造方法
  24.     {
  25.         A = new Size("A", 0);
  26.         B = new Size("B", 1);
  27.         C = new Size("C", 2);
  28.         $VALUES = (new Size[] {
  29.             A, B, C
  30.         });
  31.     }
  32. }

复制代码
5、从以上例子我们可以看出,java实际上底层使用了类来实现枚举
6、以下是《java核心技术》中的讲解
     A、所有的枚举类型都是java.lang.Enum类的子类
     B、比较两个枚举类型值时不需要用equals(),用"=="就可以了
     C、在JDK5中可以像下面这样使用枚举
  1. enum Size{
  2.         SMALL("S"),MEDIUM("M"),LARGE("L");
  3.         Size(String str)//
  4.         {
  5.                 this.str=str;
  6.         }
  7.         private String str;
  8. }
复制代码
7、根据以上回答,我很想知道jdk7以前的switch语句能不能判断一个内部值是String的枚举变量?求验证?
作者: 奚华    时间: 2012-11-18 00:03
java反编译工具jad.exe可以到百度中搜索后下载!
作者: 奚华    时间: 2012-11-19 20:14
java里面万物都是对象,把枚举理解为对象更加统一了,一致了!!
作者: 张超    时间: 2012-11-19 23:23
奚华 发表于 2012-11-18 00:00
首先,我举个例子,做个试验来共同探讨。看下面的代码:
1、我先定义一个枚举Size将这段代码保存为Size.jav ...

厉害                  
作者: 李刚    时间: 2012-11-20 17:18
为什么要有枚举
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个(比如一周有七天可以定义星期类),否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,
作者: 唐永康    时间: 2012-11-25 18:07
奚华 发表于 2012-11-18 00:00
首先,我举个例子,做个试验来共同探讨。看下面的代码:
1、我先定义一个枚举Size将这段代码保存为Size.jav ...

很好,不错,能理解。很好,不错,能理解。很好,不错,能理解。很好,不错,能理解。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2