A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唐永康 中级黑马   /  2012-11-17 23:07  /  1976 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


对于枚举的理解,枚举相当于一个类,而枚举里面的大写常量就相当于一个枚举类的对象,不知道这样理解对不对,总感觉这样理解有些别扭,谁能更深入的理解,求教。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
首先,我举个例子,做个试验来共同探讨。看下面的代码:
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的枚举变量?求验证?

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
java反编译工具jad.exe可以到百度中搜索后下载!
回复 使用道具 举报
java里面万物都是对象,把枚举理解为对象更加统一了,一致了!!
回复 使用道具 举报
奚华 发表于 2012-11-18 00:00
首先,我举个例子,做个试验来共同探讨。看下面的代码:
1、我先定义一个枚举Size将这段代码保存为Size.jav ...

厉害                  
回复 使用道具 举报
为什么要有枚举
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个(比如一周有七天可以定义星期类),否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
奚华 发表于 2012-11-18 00:00
首先,我举个例子,做个试验来共同探讨。看下面的代码:
1、我先定义一个枚举Size将这段代码保存为Size.jav ...

很好,不错,能理解。很好,不错,能理解。很好,不错,能理解。很好,不错,能理解。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马