突然
我正在输入口袋妖怪类型的枚举public enum Type {
NORMAL () { // This is the question. Why does Java allow this?
int x = 10; // Only accepts variables?
};
Type () {}
}
此代码编译正确。
对于常量使用代码块是什么?
答案 0 :(得分:10)
枚举中的代码块允许您覆盖枚举类型中定义的方法。例如
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"
,而在任何其他doFoo()
上调用Foo
会产生"Default foo"
。
答案 1 :(得分:2)
在Java中,枚举不是整数的简单别名,就像许多其他编程语言一样。在Java中,枚举值是完整的对象,可以包含用户定义的数据,方法等。
如果您按如下方式编写枚举类:
enum PetType { CAT, GOLDFISH }
实际发生的是你定义了一个类PetType
(它是标准Java类Enum
的子类)和这个类的两个实例,CAT
和{{1} }。 Java编译器确保永远不会有更多GOLDFISH
个实例,并且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!");
}
}
类的另一个(匿名)子类,它定义了一个值为10的附加成员变量Type
。这个子类的唯一实例是{ {1}}对象。如果您编译代码,您将看到x
形式的文件,这是该子类。