3
public enum myEnum {    
VAL1(10), VAL2(20), VAL3("hai") {
        public Object getValue() {
            return this.strVal;
        }
        public String showMsg() {
            return "This is your msg!";
        }
    };
    String strVal;
    Integer intVal;
    public Object getValue() {
        return this.intVal;
    }
    private myEnum(int i) {
        this.intVal = new Integer(i);
    }
    private myEnum(String str) {
        this.strVal = str;
    }
}

在上面的枚举中,当我为 VAL3 添加一个常量特定类主体时,究竟会发生什么?

VAL3 的类型定义为 myEnum 的子类型,因为它具有重载和附加方法。(类类型为 'myEnum$1' )

但是编译器如何创建一个扩展 myEnum 的子类型枚举,因为所有枚举都已经在扩展 java.lang.enum ?

4

2 回答 2

5

您的 myEnum 类继承自 java.lang.Enum。VAL3 是一个匿名内部类,它继承自名为 myEnum$1 的 myEnum。将 enum 关键字视为语法糖。它为您设置具有正常继承树的类,但不允许您直接扩展 java.lang.Enum 或 myEnum。

于 2008-11-26T04:08:16.417 回答
0

从反编译器


package com.sun.tools.xjc.outline;


public final class Aspect extends Enum
{
    public static final Aspect EXPOSED;
    public static final Aspect IMPLEMENTATION;
    private static final Aspect $VALUES[];

    static 
    {
        EXPOSED = new Aspect("EXPOSED", 0);
        IMPLEMENTATION = new Aspect("IMPLEMENTATION", 1);
        $VALUES = (new Aspect[] {
            EXPOSED, IMPLEMENTATION
        });
    }

    public static final Aspect[] values()
    {
        return (Aspect[])$VALUES.clone();
    }

    public static Aspect valueOf(String name)
    {
        Aspect arr$[] = $VALUES;
        int len$ = arr$.length;
        for(int i$ = 0; i$ < len$; i$++)
        {
            Aspect aspect = arr$[i$];
            if(aspect.name().equals(name))
                return aspect;
        }

        throw new IllegalArgumentException(name);
    }

    private Aspect(String s, int i)
    {
        super(s, i);
    }


}
于 2008-11-26T09:34:48.817 回答