繁体   English   中英

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

[英]Why enum constant class body can define arbitrary instance fields, and methods, but it can't declare static members or define constructors

James Gosling《 Java编程语言》中指出

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

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

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

}

为什么会这样呢?

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

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

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内部类可以稍微混淆本身。 我建议调查一下,并在需要时询问后续问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM