在文章【集合框架】之深入分析ArrayList中,发现一个问题如下:
问题1: elementData的注释的意思是,非私有化以简化嵌套类的访问,但嵌套类可以透明地访问外围类的所有成员,如何理解这里的简化?
为什么不声明为private
呢?
通过查看反编译查看字节码解决了问题:
虚拟机不知道类的分组情况,会在类中提供非public方法供其他类访问私有成员,也可用于封闭类。内部类在访问外部类私有变量时,编译器会为外部类添加一个非公有方法,内部类通过持有外部类的引用,调用此方法,访问私有变量。
故声明为非私有,可简化编译器添加非公有方法这个操作,提高效率。
如果安全允许且无封装此对象的必要,使用private会加重编译器的负担。
1.内部类访问外部非private
变量
public class Outer {
public int i = 10;
public class Inner {
public int j = i;
}
public static void main(String[] args) throws InterruptedException {
Outer outer = new Outer();
Inner inner = outer.