Java内部类之访问权限和编译效率

本文探讨了Java内部类如何访问外部类的非私有变量和私有变量,揭示了编译器在处理内部类访问外部类成员时的机制。通过字节码分析,解释了非私有化外部变量能简化编译器生成的非公有访问方法,提高编译效率。同时,详细展示了内部类访问外部变量的字节码过程,包括编译器自动为外部类添加的访问方法。
摘要由CSDN通过智能技术生成

在文章【集合框架】之深入分析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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值