java—从重写方法访问枚举的私有字段

iibxawm4  于 2021-07-03  发布在  Java
关注(0)|答案(3)|浏览(292)

我在玩枚举时发现这段代码无法编译:

class TrafficLight{
    enum Color{
        RED(23){
            private int y=5;
            @Override
            public int sum(){
                return val+y;
            }
        }, 
        GREEN(24);
        private int val;
        Color(int x){
            val=x;
        }
        public int sum(){
            return val;
        }
    }
}

错误是: non-static variable cannot be referenced from a static context 但是,如果我更改上的访问修饰符 val 为了保护代码编译没有问题。
我想弄明白为什么会这样。有人告诉我,我可以把枚举看作是一个带有匿名子类(每个离散值对应一个子类)的静态类。
我想它可能有点合适,因为如果字段受到保护,它可以从内部访问 RED ,但因为 RED 他没有自己的构造器,他自己的 val 不会初始化,所以如果 val 它是私有的,没有任何东西可以访问。
我想知道这是否是思考枚举的正确方法,以及我的解释是否有意义。
谢谢。

plicqrtu

plicqrtu1#

我认为枚举是不可变的值类,其中的值表示所有可能的示例。我甚至不知道可以将枚举子类化。

goqiplq2

goqiplq22#

在java中,enum类是一个特殊的类,但它仍然遵循java范围。
在java中,子类不能从父类访问任何私有方法、变量。
对于上述问题,枚举 Red 正在扩展color类(并且只有枚举中的值才能对其进行扩展)。为了获取 valColor ,您可以从

private int val;

int val;
4sup72z8

4sup72z83#

由于语法歧义,编译器消息具有误导性。如果您将引用更改为 valthis.val ,您应该得到更合适的消息:
trafficlight.color.val字段不可见
它清楚地描述了这个问题。在这种情况下,保护它将解决编译错误。实际上是示例的类型 RED 是继承自的匿名类 Color . 如果 var 是受保护的(或者实际上是非私有的),它将从 RED 的匿名类。

相关问题