黑马程序员技术交流社区

标题: 关于枚举的问题 [打印本页]

作者: 381946250    时间: 2013-5-27 17:39
标题: 关于枚举的问题
本帖最后由 381946250 于 2013-5-28 09:08 编辑

public class EnumTest {

        public static void main(String[] args){
                 WeekDay sunday = WeekDay.SUN;
                 sunday.info();
         }
         
         public enum WeekDay{
                 MON,Tue,WED,THU,Fri,AST,SUN;
                 
                private WeekDay(){
                         System.out.println("调用WeekDay枚举类的构造方法");
                 }
                 
                private void info(){
                         System.out.println("调用WeekDay枚举类的info()方法");
                 }
         }
}
***********运行结果************************
调用WeekDay枚举类的构造方法
调用WeekDay枚举类的构造方法
调用WeekDay枚举类的构造方法
调用WeekDay枚举类的构造方法
调用WeekDay枚举类的构造方法
调用WeekDay枚举类的构造方法
调用WeekDay枚举类的构造方法
调用WeekDay枚举类的info()方法


****************************************
我的问题是我只在main方法里面调用SUN这一个对象。为什么枚举类里所有的对象都创建了一遍啊!!?都创建了一遍有点浪费资源吧!!
作者: 王溢君    时间: 2013-5-27 19:17
枚举值就是一个实例对象。。。。。。。
作者: 821728010    时间: 2013-5-27 19:36
           我的理解是,枚举中的元素都是自己定义的,这样的话用到的可能性很大!如果再用到其他的值还要创建对象(),这样更消耗资源!一次创建完就完事了!
作者: xiewen    时间: 2013-5-27 20:35
本帖最后由 xiewen 于 2013-5-27 20:37 编辑

你这个枚举就相当于这样一个类,代码如下:
  1. final class WeekDay

  2.   {
  3. public static final WeekDay SPRING=new WeekDay();  
  4.     public static final WeekDay WINTER=new WeekDay();  
  5.     public static final WeekDay SUMMER=new WeekDay();  
  6.     public static final WeekDay AUTUMN=new WeekDay();  
  7.    ...
  8.     private Season(){...}  
  9.   }  
复制代码
看到这个代码应该就知道怎么一回事了;
                               黑马云青年为您解答






作者: 顾玲玉    时间: 2013-5-27 22:54
在枚举类中列出枚举值时,实际上就会调用构造器创建枚举类对象,只是这里无需使用new关键字,也无需显示调用构造器。所以在你列出WeekDay的7个值时,就已经申请了相应的空间创建了相对应的对象,这是由枚举类的性质决定的,没有什么浪费资源的。
WeekDay sunday = WeekDay.SUN;     这个将SUN这个对象返回,即返回sunday。
可能表达的不是太好,希望对你有帮助!
作者: 顾玲玉    时间: 2013-5-27 22:59
补充一下,枚举类通常被设计成不可变类,也就是说它的属性值不应该允许改变,这样会更安全,因此,通常枚举类的属性都会用private final修饰。
作者: tshch1989    时间: 2013-5-27 23:18
在枚举中,MON,TUE,这些常量是等同这样建立的:
final Static WeekDay MON=new WeekDay(){};所以每个枚举常量在初始化的时候自动成为枚举类的一个匿名子类的句柄,这是java在定义枚举这类事物时如此设定的,
作者: 381946250    时间: 2013-5-28 08:46
谢谢各位,问题已解决
作者: 王安琪    时间: 2013-5-30 12:43
好好学习,天天向上




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