在詹姆斯·高斯林的《Java编程语言》中指出
"与其他匿名内部类一样,枚举常量类主体可以定义任意实例字段和方法,但不能声明静态成员或定义构造函数。另请注意,因为枚举常量是隐式静态字段,所以这些匿名内部类没有封闭实例。"
我试图在以下代码中做到这一点并得到错误
“字段片段类型不能声明为静态;静态字段只能声明为静态或顶级类型”(什么意思)
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);
}
为什么会这样呢?
您只能在类中声明静态变量。
好吧,让我们看看这里到底发生了什么。
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());
规范说非静态
内部类[2]不能声明静态
成员。我不相信[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]我想静态
和非静态
内部类之间的区别本身可能会有些混乱。我建议调查一下,如果需要,提出一个后续问题。