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这个文件怎么来的,了解不了。
求高手解惑。
{
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这个文件怎么来的,了解不了。
求高手解惑。
解决方案 »
- struts 打开新画面问题
- 向经常用反射的人求个通用的函数
- 关于代码注释 高手来帮忙下 我在线等 帮忙把代码注释一下 我是新手
- JAVA核心技术 急求
- Access 驱动程序] 参数不足,期待是 1。
- java 鼠标拖拽能否产生类似于windows的拖拽阴影
- 这个程序运行的结果为什么是22阿?(scjp模拟题)
- 在JBuilder中使用oracle.jdbc.driver.OracleDriver时,系统提示不在ClassPath中,我该怎么办?
- 欢迎有志于计算机书籍的翻译与写作的朋友加盟z-axix工作室!
- 100分求JCREATOR2.00-0006的注册码
- 关于Exception in thread "Timer-0"
- 如果把结果读入文件中
你写了也没什么影响,相当于在定义后写了一句空语句
第二个总题,每个类定义都会生成一个class文件
/**
* 当枚举存在字段和方法的时候,要求先声明常量,再定义字段和方法 并且此时,
* 所有枚举常量声明结束时要用“;“,它们之间用”,”。下面没有“;”就会报错,有就不会
*/
private enum InnerAction {
TURN_LEFT, TURN_RIGHT, SHOOT
private double a;
}
对于这个,个人认为枚举类型声明时会定义一个类(class)于是产生了EnumDemo$InnerAction.class,而同时它又做为内部类包含在EnumDemo中所以同时会产生EnumDemo$1.class
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();
}
结果只有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)你的环境是多少??
Java(TM) SE Runtime Environment (build 1.7.0-ea-b57)
Java HotSpot(TM) Client VM (build 16.0-b02, mixed mode, sharing)
//反编译看看:
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,不知道是为什么?