android 内存泄漏的初级见识

内部类的使用

java的非静态内部类和匿名内部类会默认包含外部类的引用,因此在非静态(或匿名)内部类中我们可以直接访问外部类的方法和私有变量。但是静态的内部类是不会持有外部类的引用的,原因是这是编译器决定了的,编译器默认在非静态内部类和匿名内部类的构造函数中传入外部类,这个时候,需要注意了,当外部类与内部类生命周期不一致的时候很有可能发生内存泄漏。 例如在一个Activity启动一个Thread执行一个任务,因为Thread是内部类持有了Activity的引用,当Activity销毁的时候如果Thread的任务没有执行完成,造成Activity的引用不能释放,Activity不能被释放而引起了内存泄漏。 声明为static的类不会持有外部类的引用,如果你想使用外部类的话,可以通过软引用的方式保存外部类的引用。
注意:外部类拥有对内部类中所有元素的访问权限的,包括private修饰。原因是:编译器一手操办的

总结:

1:内部类拥有对外部类所有元素直接访问的权限,同理外部类也拥有内部类所有元素访问的权限(前提是必须获取到内部类对象)。因为编译器偷偷的往外部类或内部类中创建了可以访问私有变量的静态方法。

2:外部类中可以创建私有内部类以及声明了私有构造方法的内部类,同理内部类中可以创建声明了私有构造方法的外部类。因为编译器偷偷的往内部类或外部类中创建了包可见构造方法,从而使外部类或内部类获得了访问权限。

3:Java虚拟机其实并不知道内部类这个概念,编译器会把内部类抽离成一个带有$名称的普通类,并对其内部类和外部类,添加相应的构造方法、静态方法、成员变量,而这些元素让外部类和内部类建立起了联系

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,532评论 25 708
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,778评论 18 399
  • 一.Java内存分配结构复习 1.Java内存分配策略 上一篇Android内存管理分析总结中我们提到了Java内...
    Geeks_Liu阅读 832评论 5 7
  • 写一篇自己从来不熟悉的题材 本来要写今天的生活琐事 来一次大胆的常识 图腾是远古时代 ,母系氏族社会 时期的 部落...
    谷喵儿阅读 187评论 0 0
  • 那个冬夜 那份美好 当我躺在时光的河床上回溯时 我是心存感激和敬畏的。过往的一切,如清澈的...
    Estellee阅读 245评论 0 0