我正在输入一个宝可梦类型的枚举时,突然
public enum Type {
NORMAL () { // This is the question. Why does Java allow this?
int x = 10; // Only accepts variables?
};
Type () {}
}
这段代码编译正确。
常量代码块有什么用处?
我正在输入一个宝可梦类型的枚举时,突然
public enum Type {
NORMAL () { // This is the question. Why does Java allow this?
int x = 10; // Only accepts variables?
};
Type () {}
}
这段代码编译正确。
常量代码块有什么用处?
枚举中的代码块允许您覆盖枚举类型中定义的方法。例如
enum Foo {
PEAR,
BANANA() {
@Override
public void doFoo() {
System.out.println("Banana foo");
}
},
APPLE,
GRAPE;
public void doFoo() {
System.out.println("Default foo");
}
}
这里,Foo.BANANA.doFoo()
将产生"Banana foo"
,而在任何其他Foo
上调用doFoo()
将产生"Default foo"
。
enum PetType { CAT, GOLDFISH }
PetType
(它是标准Java类Enum
的子类)和该类的两个实例CAT
和GOLDFISH
。Java编译器确保不会有更多的PetType
实例,并且CAT
和GOLDFISH
始终引用同一对象。MyEnum
是一个普通的类。您可以为其定义成员变量和方法,并通过构造函数进行初始化:enum PetType {
CAT(true),
GOLDFISH(false);
private boolean isHairy;
PetType(boolean isHairy) {
this.isHairy = isHairy;
}
public boolean isHairy() {
return isHairy;
}
}
public static void displayWhetherHairy(CatType catType) {
if (catType.isHairy()) {
System.out.println("This pet is hairy!");
}
else {
System.out.println("This pet is not hairy!");
}
}
这就是为什么您可以在枚举定义中使用代码的原因。
您在代码中所做的基本上是定义Type
类的另一个(匿名)子类,该子类定义了一个附加的成员变量x
,其值为10。这个子类的唯一实例是NORMAL
对象。如果您编译您的代码,您将会看到一个形式为Type$1.class
的文件,这就是这个子类。