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 语言规范,第 6.6.1 节 http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6.1:
否则,如果声明了成员或构造函数private
,那么当且仅当访问发生在包含成员或构造函数声明的顶级类(第 7.6 节)的主体内时,才允许访问。
例如,这也是有效的:
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# 中,私有成员只能在该类型的程序文本中访问,包括从任何nested类型。所以上面的 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,这does用Java编译。因此,Java 对私有成员的规定基本上比 C# 宽松一些。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)