Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么枚举类型上的私有字段对包含类可见?_Java_Enums_Access Control - Fatal编程技术网

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