请考虑以下代码片段。
public class HelloWorld{
private static class InnerA{
private int _a;
private InnerA( int a ){
_a = a;
}
private int getA(){
return _a;
}
}
private static class InnerB{
private InnerB(){
InnerA inner_a = new InnerA( 1 ); //isn't the constructor of InnerA private??
System.out.println( inner_a.getA() ); //isn't getA() a private function of InnerA??
}
}
public static void main(String []args){
InnerB b = new InnerB();
}
}
我的问题是:
InnerA
的构造函数被标记为私有,但为什么从InnerB
的构造函数内部成功调用它?为什么
getA()
,作为InnerA
的私有方法,可以被调用来自InnerB
内部?我想把这个方法标记为私有会阻止它在InnerA
之外使用吗?
来自语言规范:
否则,成员或构造函数被声明为私有,并且当且仅当访问发生在包含成员或构造函数声明的顶级类型(§7.6(的主体内时,才允许访问。
同一顶级类中的东西总是可以访问的。
嵌套的静态类可以访问其封闭类的所有成员,包括私有成员。
它们无法访问其封闭实例的实例成员(公共或私有(。但是,如果将静态嵌套类的方法传递给封闭类的实例,则嵌套类将能够访问封闭类的所有成员,无论其访问级别如何。
文档中写道:
嵌套类是其封闭类的成员。非静态嵌套类(内部类(可以访问封闭的其他成员类,即使它们被声明为私有。