为什么枚举常量类主体可以定义任意实例字段和方法,但它不能声明静态成员或定义构造函数

时间:2013-02-06 11:18:08

标签: java enums

Java编程语言中由James Gosling 指定

“与其他匿名内部类一样,枚举常量类体可以定义任意实例字段,和 方法,但它不能声明静态成员或定义构造函数。还要注意因为枚举常量是 隐式静态字段,这些匿名内部类没有封闭实例。“

我尝试在以下代码中执行此操作并获取错误

“字段pieceType不能声明为静态;静态字段只能在静态或顶级类型中声明” (这是什么意思)

package com.example;


enum ChessPiece{
    PAWN{
        @Override
        void pieceName(String name) {
            // TODO Auto-generated method stub
            System.out.println("PAWN");
        }
    },
    ROOK{

        @Override
        void pieceName(String name) {
            // TODO Auto-generated method stub
            System.out.println("ROOK");
        }
    },
    QUEEN{
        static String pieceType = "QUEEN"; // ERROR
        @Override
        void pieceName(String name) {
            // TODO Auto-generated method stub
            System.out.println("QUEEN");
        }
    };

    abstract void pieceName(String name);

}

为什么会这样?

2 个答案:

答案 0 :(得分:0)

你只能在类中声明静态变量。

答案 1 :(得分:0)

好吧,让我们来看看这里到底发生了什么。

QUEEN{
    static String pieceType = "QUEEN"; // ERROR
    @Override
    void pieceName(String name) {
        // TODO Auto-generated method stub
        System.out.println("QUEEN");
    }
}

这可能不是很明显,但你已经在这里宣布了一个内部阶级。这必然源于您正在实施抽象方法,并且可以很容易地验证:

System.out.println(ChessPiece.class == ChessPiece.QUEEN.getClass());

规范说非static内部类[2]无法声明static成员。我不相信有任何重大的理论原因[1],除了在某种程度上概念上怪异,但它是如何的。

换句话说,你应该在这样的事情上看到同样的错误:

class Foo {
    static final String TOP_LEVEL = "ok";
    static class Bar {
        static final String NESTED_STATIC = "ok";
    }
    class Bar {
        static final String NESTED_NOT_STATIC = "error";
    }
}

[1]对Java管道有更好理解的人应该随意纠正这个问题。

[2]我想static和非static内部类之间的差异可能会让人感到困惑。如果需要,我建议调查并询问后续问题。