关于Java的内部类的可见性问题,平时并未太注意。不过使用时,其实还是应该明确一点:就是关于内部类和他的外部类的可见性问题:private这种修饰符并不能阻止外部类直接访问到内部类中的private属性;反之亦然。
这里直接看代码会更清楚一些:
public class VisibilityTest {
private String outerName;
public String showInnerName(InnerClass innerClass){
// Notice : innerName in InnerClass is "private"
// But here can be accessed directly without using any public getter.
return innerClass.innerName;
}
private static class InnerClass{
private String innerName;
// Notice : outerName in VisibilityTest is "private"
// But here can be accessed directly without using any public getter.
public String showOuterClass(VisibilityTest visibilityTest){
return visibilityTest.outerName;
}
}
}
上面的代码不会有任何编译错误,事实上在Java中也是完全合法的。
关于内部类这种可见性的特点,在内部类访问外部类属性或者在外部类访问内部类属性,都相对来说更方便。
一个典型的应用场景是:在利用内部类实现懒加载方式的单例模式,具体可以参考这里。