有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

为什么Java允许枚举常量使用代码块?

我正在键入口袋妖怪类型的枚举,突然

public enum Type {

    NORMAL () { // This is the question. Why does Java allow this?
        int x = 10; // Only accepts variables?
    };

    Type () {}

}

这段代码编译正确

常量的代码块有什么用


共 (2) 个答案

  1. # 1 楼答案

    枚举中的代码块允许您重写枚举类型中定义的方法。比如说

    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"

  2. # 2 楼答案

    在Java中,枚举不是整数的简单别名,就像在许多其他编程语言中一样。在Java中,枚举值是完整的对象,可以具有用户定义的数据、方法等

    如果按如下方式编写枚举类:

    enum PetType { CAT, GOLDFISH }
    

    实际上,您定义了一个类PetType(它是标准Java类Enum的子类)和这个类的两个实例CATGOLDFISH。Java编译器确保不再有更多的PetType实例,并且CATGOLDFISH始终引用同一个对象

    但除此之外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类的另一个(匿名)子类,它定义了一个值为10的额外成员变量x。这个子类的唯一实例是NORMAL对象。如果您编译代码,您将看到一个Type$1.class格式的文件,这就是这个子类