1

James Gosling 的 The Java Programming Language中,它指定

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

我试图在下面的代码中做到这一点并得到错误

“字段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);

}

为什么会这样?

4

2 回答 2

0

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

于 2013-02-06T11:20:48.463 回答
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 管道有更好理解的人应该随时纠正这个问题。

static[2] 我猜想和非内部类之间的区别static本身可能有点令人困惑。我建议调查一下,并在需要时提出后续问题。

于 2017-09-04T19:40:37.083 回答