黑马程序员技术交流社区

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

作者: 黑马李杰    时间: 2013-4-14 16:28
标题: 关于枚举问题
本帖最后由 黑马李杰 于 2013-4-15 20:45 编辑

枚举能不能被继承,为什么?枚举是个抽象类,它的构造函数是私有的,子类继承枚举,子类默认的构造函数调用父类的构造函数,跟私不私有没关系吧,应该可以继承吧,就是没什么用。对么?

作者: Asan    时间: 2013-4-14 16:41
所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。
作者: liuyangyang    时间: 2013-4-14 16:47
你好,
我刚测试了一下发现枚举是不能继承的,语法不能通过。可以是因为枚举中有包含对象,对象不能被继承的原因。
但是枚举可以去实现一个接口。
作者: ①人←①城市    时间: 2013-4-14 17:07
Enum是不可以被继承的,也不可以继承自别人,只是能实现接口而已


加一个例子了:


public enum Fruit {  
    APPLE, PEAR, PEACH, ORANGE;  
}  

以上是一个简单的enum,关于它,我要补充一点:
Fruit是java.lang.Enum的子类,准确地说,是Enum<Fruit>的子类,这里出现了一个继承关系,不过这个继承是编译器帮我们做的,我们不能显式地去做。不信的话我们可以试着用一个Enum<Fruit>的引用去指向一个APPLE,肯定是没问题的,我就不再试了。
为了更直观地说明这一点,我们来看看Fruit的反编译结果吧:


package test;  
  
  
public final class Fruit extends Enum  
{  
  
    private Fruit(String s, int i)  
    {  
        super(s, i);  
    }  
  
    public static Fruit[] values()  
    {  
        Fruit afruit[];  
        int i;  
        Fruit afruit1[];  
        System.arraycopy(afruit = ENUM$VALUES, 0, afruit1 = new Fruit[i = afruit.length], 0, i);  
        return afruit1;  
    }  
  
    public static Fruit valueOf(String s)  
    {  
        return (Fruit)Enum.valueOf(test/Fruit, s);  
    }  
  
    public static final Fruit APPLE;  
    public static final Fruit PEAR;  
    public static final Fruit PEACH;  
    public static final Fruit ORANGE;  
    private static final Fruit ENUM$VALUES[];  
  
    static   
    {  
        APPLE = new Fruit("APPLE", 0);  
        PEAR = new Fruit("PEAR", 1);  
        PEACH = new Fruit("PEACH", 2);  
        ORANGE = new Fruit("ORANGE", 3);  
        ENUM$VALUES = (new Fruit[] {  
            APPLE, PEAR, PEACH, ORANGE  
        });  
    }  
}  

注意这几行:

public static final Fruit APPLE;  
    public static final Fruit PEAR;  
    public static final Fruit PEACH;  
    public static final Fruit ORANGE;  

看来JDK Enum的实现也不过就是沿袭了Effective Java中提出的TypeSafeEnum模式,只不过是在编译器和JVM等更底层的级别上提供了支持。
作者: love_java    时间: 2013-4-14 17:49
枚举不能够被继承, 它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口。枚举也不是个抽象类。所有枚举值都是public,static,final的。注意这一点只是针对于枚举值,我们可以和在普通类里面定义变量一样定义其它任何类型的非枚举变量,这些变量可以用任何你想用的修饰符。 虽然enum不可以有public的构造函数,但是我们还是可以定义private的构造函数,在enum内部使用。枚举实现的接口其实和普通的类实现一个接口是一样的。




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