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); } }
有关参与此枚举的父子类,相同包中的类等的访问控制有其他规则吗?我可以在规范中找到这些规则吗?
解决方法
它与枚举无关 – 它与从包含类型到嵌套类型的私有访问有关.
从Java language specification,section 6.6.1:
Otherwise,if the member or constructor is declared
private
,then access is permitted if and only if it occurs within the body of the top level class (§7.6) that encloses the declaration of the member or constructor.
例如,这也是有效的:
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; } }
有趣的是,C#的工作方式略有不同 – 在C#中,私有成员只能在类型的程序文本中访问,包括任何嵌套类型.所以上面的Java代码将不起作用,但是这样做会:
// 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); } } }
…但是如果您只是将Console.WriteLine更改为System.out.println,那么它将以Java编译.所以Java基本上比C#的私人成员更松懈.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。