为什么Java允许枚举常量使用代码块?
我正在键入口袋妖怪类型的枚举,突然为什么Java允许枚举常量使用代码块?,java,enums,Java,Enums,我正在键入口袋妖怪类型的枚举,突然 public enum Type { NORMAL () { // This is the question. Why does Java allow this? int x = 10; // Only accepts variables? }; Type () {} } 这段代码编译正确 常量的代码块有什么用?枚举中的代码块允许您重写枚举类型中定义的方法。比如说 enum Foo { PEAR,
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”,在Java中,枚举不是整数的简单别名,就像在许多其他编程语言中一样。在Java中,枚举值是完整的对象,可以具有用户定义的数据、方法等
如果按如下方式编写枚举类:
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!");
}
}
这就是为什么可以在枚举定义中使用代码
您在代码中所做的基本上是定义类型
类的另一个(匿名)子类,该子类定义了一个值为10的额外成员变量x
。该子类的唯一实例是NORMAL
对象。如果您编译代码,您将看到一个格式为Type$1.class
的文件,这就是这个子类。看看“行星”——例如:看看它有什么用处。