Java常量特定的类主体私有变量访问

Java常量特定的类主体私有变量访问,java,enums,static,Java,Enums,Static,为什么它不能编译,以及(相关地)为什么CC不能访问我认为(可能我错了)它自己的(私有)成员变量I,而AA和BB确实可以这样做? CC如何访问自己的成员变量 多谢各位 enum TestEnum { AA(1000), BB(500), CC(100) { public int getI() { return i + 1; } }; TestEnum(int i) { this.i = i; } private int i; publi

为什么它不能编译,以及(相关地)为什么CC不能访问我认为(可能我错了)它自己的(私有)成员变量I,而AA和BB确实可以这样做? CC如何访问自己的成员变量

多谢各位

enum TestEnum {
  AA(1000), BB(500), CC(100) {
    public int getI() {
      return i + 1;
    }
  };
  TestEnum(int i) {
    this.i = i;
  }

  private int i;
  public int getI() {
    return this.i;
  }
}
javac输出:

TestEnum.java:6: error: non-static variable i cannot be referenced from a static context
                 public int getI() { return i + 1; }
                                            ^
1 error
使用
super.getI()-1
,因为您希望覆盖父级的方法

public enum TestEnum {
    AA(1000), BB(500), CC(100) {

        @Override
        public int getI() {
            return super.getI() - 1;
        }
    };

    private int i;

    TestEnum(int i) {
        this.i = i;
    }

    public int getI() {
        return this.i;
    }
}

或者,按照@oleg cherednik的建议,将字段
设置为protected
以直接访问它(
返回i-1;
)。但是,我更喜欢上面的解决方案。

您有两个选择:要么执行
受保护的
字段,要么调用
super.getId()
。我更喜欢做第一个,它更容易阅读注意:考虑像
父类那样的枚举体,以及像
子类那样的每个常量,因此您的私有字段在
子类AA、BB、CC中不可见

public enum TestEnum {
    AA(1000),
    BB(500),
    CC(100) {
        @Override
        public int getI() {
            return i + 1;
        }
    };

    protected final int i;

    TestEnum(int i) {
        this.i = i;
    }

    public int getI() {
        return i;
    }
}

p.S.枚举中最好只有
final
字段,因为枚举类似于常量,不应该有任何变量。

为什么要有
getI
两次?第一个的括号是什么?分号应直接位于
CC(100)
之后。。。看:我是私人的,从技术上讲,我猜你是在制造一个亚型。尝试super.getI而不是i。这可能是正确的猜测,但是javac的输出指出了i是静态的这一事实,这在目前是没有意义的。另一个测试可能是使
i
受保护
而不是
私有
,这很快!啊,当然。非常感谢。这也表明TestEnum的每个实例(或枚举常量)实际上是一个子类,因为子类也不能访问其超类的私有变量。是这样吗?@JL_SO:请从@HovercraftFullOfEels中查看原因?@JL_SO:这样你可以1)投票支持这个答案,2)可能也会接受它。@HovercraftFullOfEels我已经尝试投票支持它了。我没有足够的分数或者他们在这里称之为什么。我努力想看看你在这里改变了什么。你应该在答案中加上一些文字。