Skip to content

为什么非静态内部类引用外部类的引用

Mr.wu edited this page Feb 5, 2017 · 1 revision

##下面回头看上面写的例子:

这其实是一个我们在编程中经常用到的场景,就是在一个内部类里面访问外部类的private成员变量或者方法,这是可以的。 这是为什么,不是private修饰的成员只能被成员所述的类才能访问么?难道private真的失效了么? 其实是编译器帮我们做了一些我们看不到的工作,下面我们通过反编译把这些看不到的工作都扒出来看看

##反编译后

1.下面这一份是通过 dex2jar + jad 进行反编译得到的近似源码的java类

可以看到这份反编译出来的代码,比我们编写的源码,要多了一些东西,在内部类MyRunnable里面多了一个MainActivity的成员变量,并且,在构造函数里面获得了外部类的引用

这段代码基本上还原了编译器编译后指令的执行方式。内部类调用外部类,是通过一个外部类的引用进行调用的(上面红色框框的两段代码是在还原的基础上加入的,用于解释内部类调用外部类的方式,调用方式1是我们常用的,而到的编译器编译后,实际调用方式是2),而外部类的private属性则通过编译器生成的我们看不见的静态方法,通过传入外部类实例引用获取出来。 通过还原,我们了解了非静态内部类跟外部类交互时的工作方式,以及非静态内部类为什么会持有外部类的引用。

参考:http://blog.csdn.net/xyq046463/article/details/51769728

Home

Android 开发录

-深入理解LayoutInflater.inflate()的参数

计算机网络原理

数据库

Java 垃圾回收机制

Java 开发录

面试

搭建翻墙shadowsocks 教程

其他

Clone this wiki locally