public class EnumDemo
{
    private enum InnerAction{TURN_LEFT,TURN_RIGHT,SHOOT}    public static void main(String []args)
    {
        doAction(InnerAction.TURN_LEFT);
    }
    public static void doAction(InnerAction action)
    {
        switch (action)
        {
        case TURN_LEFT :
            System.out.println("向左转");
            break;
        case TURN_RIGHT :
            System.out.println("向右转");
            break;
        case SHOOT :
            System.out.println("射击");
            break;
        
        }
    }
}
第一个问题:第二行:private enum InnerAction{TURN_LEFT,TURN_RIGHT,SHOOT}发现后面可以用分号(;)结尾,也可以不用,编译和执行结果都可以通过。请问有什么区别吗?
第二个问题:为什么编译后会生成这三个文件EnumDemo.class、EnumDemo$InnerAction.class、EnumDemo$1.class呢?尤其是EnumDemo$1.class这个文件怎么来的,了解不了。
求高手解惑。

解决方案 »

  1.   

    那个class文件时枚举型特有的,实际上被认为了一个类,所以会额外产生一个独立的class文件。跟内部类差不多。
      

  2.   

    java中类定义、接口定义、枚举定义后都不需要分号
    你写了也没什么影响,相当于在定义后写了一句空语句
    第二个总题,每个类定义都会生成一个class文件
      

  3.   


        /**
         * 当枚举存在字段和方法的时候,要求先声明常量,再定义字段和方法 并且此时,
         * 所有枚举常量声明结束时要用“;“,它们之间用”,”。下面没有“;”就会报错,有就不会
         */
        private enum InnerAction {
            TURN_LEFT, TURN_RIGHT, SHOOT
            private double a;
        }
      

  4.   

    “EnumDemo$1.class这个文件怎么来的,了解不了”
    对于这个,个人认为枚举类型声明时会定义一个类(class)于是产生了EnumDemo$InnerAction.class,而同时它又做为内部类包含在EnumDemo中所以同时会产生EnumDemo$1.class
      

  5.   

    JDK 中的枚举实际上是个糖衣,其生成的是个匿名内部类public enum Color {
        RED, BLUE, GREEN
    }与这样做是一样的public class Color {
        private Color() {}
        public final static Color RED   = new Color();
        public final static Color BLUE  = new Color();
        public final static Color GREEN = new Color();
    }
      

  6.   

    算是瞎说了~~楼主我贴完上面的帖子,就感觉不对劲,就把代码拿下来跑了一下~~
    结果只有EnumDemo.class、EnumDemo$InnerAction.class,根本就没有EnumDemo$1.class
    测试环境://java version "1.6.0-beta2"
    //Java(TM) SE Runtime Environment (build 1.6.0-beta2-b86)
    //Java HotSpot(TM) Client VM (build 1.6.0-beta2-b86, mixed mode, sharing)你的环境是多少??
      

  7.   

    java version "1.7.0-ea"
    Java(TM) SE Runtime Environment (build 1.7.0-ea-b57)
    Java HotSpot(TM) Client VM (build 16.0-b02, mixed mode, sharing)
      

  8.   

    确实就是2个class文件 多出的那个就是枚举型产生的
      

  9.   


    //反编译看看:
    import java.io.PrintStream;public class EnumDemo
    {
        private static final class InnerAction extends Enum
        {        public static InnerAction[] values()
            {
                return (InnerAction[])$VALUES.clone();
            }        public static InnerAction valueOf(String s)
            {
                return (InnerAction)Enum.valueOf(EnumDemo$InnerAction, s);
            }        public static final InnerAction TURN_LEFT;
            public static final InnerAction TURN_RIGHT;
            public static final InnerAction SHOOT;
            private static final InnerAction $VALUES[];        static 
            {
                TURN_LEFT = new InnerAction("TURN_LEFT", 0);
                TURN_RIGHT = new InnerAction("TURN_RIGHT", 1);
                SHOOT = new InnerAction("SHOOT", 2);
                $VALUES = (new InnerAction[] {
                    TURN_LEFT, TURN_RIGHT, SHOOT
                });
            }        private InnerAction(String s, int i)
            {
                super(s, i);
            }
        }
        public EnumDemo()
        {
        }    public static void main(String args[])
        {
            doAction(InnerAction.TURN_LEFT);
        }    public static void doAction(InnerAction inneraction)
        {
            static class _cls1
            {            static final int $SwitchMap$EnumDemo$InnerAction[];            static 
                {
                    $SwitchMap$EnumDemo$InnerAction = new int[InnerAction.values().length];
                    try
                    {
                        $SwitchMap$EnumDemo$InnerAction[InnerAction.TURN_LEFT.ordinal()] = 1;
                    }
                    catch(NoSuchFieldError nosuchfielderror) { }
                    try
                    {
                        $SwitchMap$EnumDemo$InnerAction[InnerAction.TURN_RIGHT.ordinal()] = 2;
                    }
                    catch(NoSuchFieldError nosuchfielderror1) { }
                    try
                    {
                        $SwitchMap$EnumDemo$InnerAction[InnerAction.SHOOT.ordinal()] = 3;
                    }
                    catch(NoSuchFieldError nosuchfielderror2) { }
                }
            }        switch(_cls1..SwitchMap.EnumDemo.InnerAction[inneraction.ordinal()])
            {
            case 1: // '\001'
                System.out.println("\u5411\u5DE6\u8F6C");
                break;        case 2: // '\002'
                System.out.println("\u5411\u53F3\u8F6C");
                break;        case 3: // '\003'
                System.out.println("\u5C04\u51FB");
                break;
            }
        }
    }doAction内部产生了一个局部内部类,他有一个int[],里面存放的是enum各个元素的ordinal,不知道是为什么?