黑马程序员技术交流社区

标题: 为什么枚举中可以定义抽象方法呢?只能说是java规定? [打印本页]

作者: 冯建鹏    时间: 2012-6-4 13:08
标题: 为什么枚举中可以定义抽象方法呢?只能说是java规定?
枚举是个类,那为什么枚举里面有抽象方法单身枚举本身却不需要加abstract修饰符呢
作者: 李保成    时间: 2012-6-5 03:02
      enum很像特殊的class,实际上enum声明定义的类型就是一个类。 而这些类都是类库中Enum类的子类(java.lang.Enum<E>)。它们继承了这个Enum中的许多有用的方法。经过查看源码发现它将自己的构造函数也私有化了,它在创建对象时,调用的是父类方法中的Enum的受保护构造器创建一个枚举对象。

Enum
protected Enum(String name,
               int ordinal)单独的构造方法。程序员无法调用此构造方法。该构造方法用于由响应枚举类型声明的编译器发出的代码。

参数:
name - - 此枚举常量的名称,它是用来声明该常量的标识符。
ordinal - - 枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。

那么我们都知道被私有化的构造函数,说明这个类不能让外部通过new的方式来创建,所以这时候它是不能被实例化。也就是说不能abstract修饰。
还有一个问题就是当我们在枚举类中定义了一个抽象方法,我们是需要使用枚举值来实现这个方法,是因为枚举值它的实现是通过调用私有的构造方法,在底层创建了对象,而这时候的枚举值就相当于= new 枚举(),那么因为它里边带有抽象方法,在我们创建对象时,是需要去实现这个构造方法,所以这时候就相当于new 枚举(){。。。。。。.//实现的过程}

enum Demo{
        RED {
                @Override
                void show () {
                        // TODO Auto-generated method stub
                       
                }
        },COL {
                @Override
                void show () {
                        // TODO Auto-generated method stub
                       
                }
        };
        abstract void show();
}

作者: 何拴绪    时间: 2012-6-5 10:40
假如你定义一个枚举,
  1. public enum TracfficLamp{
  2.                 RED(30){
  3.                 public        TracfficLamp nextLamp(){
  4.                                 return GREEN;
  5.                         }
  6.                 },
  7.                 GREEN(45){
  8.                 public        TracfficLamp nextLamp(){
  9.                                 return RED;
  10.                         }
  11.                 };
  12.                 //抽象方法
  13.                 public abstract TracfficLamp nextLamp();
  14.                
  15.         }
复制代码
TracfficLamp 返回的是一个枚举类型,enum这个类本身就是一个抽象类,所以enum好比一个修饰符,RED和GREEN就通过匿名的内部类子类创建的这两个对象。并且实现抽象方法。
个人见解希望对你有帮助。
作者: 刘伯阳    时间: 2012-6-5 17:56
因为枚举类本身就是一个抽象类,这是java本身规定的。




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