我有一个用例,我将其简化为以下程序:
public class A {
private int x = 100;
class B {
private int y = new A().x;
}
public static void main(String []s) {
System.out.println(new A().new B().y);
}
}
Run Code Online (Sandbox Code Playgroud)
该程序运行良好并打印100
.
根据文档(访问修饰符):private
修饰符确保该字段只能在其自己的类中访问。但在上面的程序中,它似乎自相矛盾。
这是那个意思吗?
请帮我理解。
Java 语言规范是有关该语言的准确信息的更好来源。
在这种情况下,相关部分在第 6.6.1 条中:
否则,成员或构造函数被声明为私有,并且当且仅当它发生在包含成员或构造函数声明的顶级类型(第 7.6 节)的主体内时才允许访问。
那“顶级类型的体内”是重要的部分。
所以基本上,在同一顶级类型的主体内(A
在你的情况下),所有代码(无论是否以嵌套类型编写)都可以访问同一主体内的任何私有构造函数/成员声明(无论是否以嵌套类型声明)或不)。