gpt4 book ai didi

java - 无法使用私有(private)变量对非静态字段 memberVariable 进行静态引用

转载 作者:太空狗 更新时间:2023-10-29 22:33:49 26 4
gpt4 key购买 nike

我创建了一个带有一个私有(private)成员变量的枚举。当我尝试访问成员变量时,编译状态为“无法对非静态字段 memberVariable 进行静态引用”。

如果变量不是私有(private)的(例如 protected 或受包保护的),它可以正常编译。我不明白变量的范围与实现的抽象函数的类型(静态,非静态)有什么关系。

谁能教教我?

public enum EnumWithAbstractMethodAndMembers {
TheOneAndOnly(1) {
@Override
public int addValue(final int value) {
return memberVariable + value;
}
};

private final int memberVariable;

private EnumWithAbstractMethodAndMembers(final int memberVariable) {
this.memberVariable = memberVariable;
}

abstract int addValue(int value);

}

最佳答案

错误信息令人困惑。

问题在于,当您提供枚举值代码时,您正在创建该枚举的匿名子类。 (它的类将是 EnumWithAbstractMethodAndMembers$1)子类不能访问其父类(super class)的私有(private)成员,但是嵌套类可以通过生成的访问器方法访问。您应该能够访问私有(private)字段,它给您的错误消息似乎具有误导性。

顺便说一句,您可以使用它,但您不需要恕我直言。

    public int addValue(final int value) {
return super.memberVariable + value;
}

这是一个较短的示例,我将在错误消息中记录为错误,因为它不会导致问题的解决。

public enum MyEnum {
One {
public int getMemberVariableFailes() {
// error: non-static variable memberVariable cannot be referenced from a static context
return memberVariable;
}

public int getMemberVariable2OK() {
return memberVariable2;
}

public int getMemberVariableOK() {
return super.memberVariable;
}
};

private final int memberVariable = 1;
final int memberVariable2 = 1;
}

根据 Tom Hawkin 的反馈,此示例得到相同的错误消息。

public class MyNotEnum {
// this is the static context in which the anonymous is created
public static final MyNotEnum One = new MyNotEnum() {
public int getMemberVariableFailes() {
// error: non-static variable memberVariable cannot be referenced from a static context
return memberVariable;
}

public int getMemberVariableOK() {
return super.memberVariable;
}
};
private final int memberVariable = 1;
}

比较

public class MyNotEnum {
public class NestedNotEnum extends MyNotEnum {
public int getMemberVariableFailes() {
// compiles just fine.
return memberVariable;
}

public int getMemberVariableOK() {
return super.memberVariable;
}
}
private final int memberVariable = 1;
}

关于java - 无法使用私有(private)变量对非静态字段 memberVariable 进行静态引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8442874/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com