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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马李杰 中级黑马   /  2013-4-14 16:28  /  1530 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马李杰 于 2013-4-15 20:45 编辑

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

4 个回复

倒序浏览
所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。
回复 使用道具 举报
你好,
我刚测试了一下发现枚举是不能继承的,语法不能通过。可以是因为枚举中有包含对象,对象不能被继承的原因。
但是枚举可以去实现一个接口。
回复 使用道具 举报
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等更底层的级别上提供了支持。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
枚举不能够被继承, 它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口。枚举也不是个抽象类。所有枚举值都是public,static,final的。注意这一点只是针对于枚举值,我们可以和在普通类里面定义变量一样定义其它任何类型的非枚举变量,这些变量可以用任何你想用的修饰符。 虽然enum不可以有public的构造函数,但是我们还是可以定义private的构造函数,在enum内部使用。枚举实现的接口其实和普通的类实现一个接口是一样的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马