Java 为什么枚举类型上的私有字段对包含类可见?
关于父类子类、同一包中的类等的访问控制,是否有其他规则参考此枚举?我可以在规范中的何处找到这些规则?因为枚举实际上是父类的内部类。它与它是枚举无关-它与从包含类型到嵌套类型的私有访问有关 从: 否则,如果该成员或构造函数被声明为Java 为什么枚举类型上的私有字段对包含类可见?,java,enums,access-control,Java,Enums,Access Control,关于父类子类、同一包中的类等的访问控制,是否有其他规则参考此枚举?我可以在规范中的何处找到这些规则?因为枚举实际上是父类的内部类。它与它是枚举无关-它与从包含类型到嵌套类型的私有访问有关 从: 否则,如果该成员或构造函数被声明为私有,则只有当且仅当该成员或构造函数的声明发生在顶级类(§7.6)的主体内时,才允许访问该成员或构造函数 例如,这也是有效的: public class Parent { public enum ChildType { FIRST_CHILD(
私有
,则只有当且仅当该成员或构造函数的声明发生在顶级类(§7.6)的主体内时,才允许访问该成员或构造函数
例如,这也是有效的:
public class Parent {
public enum ChildType {
FIRST_CHILD("I am the first."),
SECOND_CHILD("I am the second.");
private String myChildStatement;
ChildType(String myChildStatement) {
this.myChildStatement = myChildStatement;
}
public String getMyChildStatement() {
return this.myChildStatement;
}
}
public static void main(String[] args) {
// Why does this work?
System.out.println(Parent.ChildType.FIRST_CHILD.myChildStatement);
}
}
有趣的是,C#的工作方式略有不同——在C#中,私有成员只能在类型的程序文本中访问,包括从任何嵌套类型访问。因此,上述Java代码不起作用,但这将:
public class Test {
public static void main(String[] args) {
Nested nested = new Nested();
System.out.println(nested.x);
}
private static class Nested {
private int x;
}
}
。。。但是,如果您只是将Console.WriteLine更改为System.out.println,那么这将在Java中编译。因此Java对私人成员的管理基本上比C更为宽松。顶级班级就像一个村庄,每个人都知道每个人,没有秘密。其中的嵌套单元不会改变这一事实
// C#, not Java!
public class Test
{
private int x;
public class Nested
{
public Nested(Test t)
{
// Access to outer private variable from nested type
Console.WriteLine(t.x);
}
}
}
谢谢你,乔恩。我一直听说枚举被称为“特殊类类型实例”,或类似的术语,我想这就是为什么有许多相同的规则适用于类和枚举,而规范没有提供任何附加说明的原因。@unretable:有趣。。。Java版本在C#中无法工作。我猜嵌套类的主体仍然算作“顶级类的主体”。将修改答案以使其更清楚。@T.J.克劳德-稍微复杂一点;本教程介绍如何从嵌套类访问封闭类的字段。OP的例子正好相反。这方面的规则在Java语言规范中有详细说明。另见。
class A
private a;
class B
private b
a = x; // ok
new B().b = y; // ok
class C extends A{}
new C().a = z; // ok