美文网首页Android进阶之路
非静态内部类为什么会持有外部类的引用

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

作者: 0一缕星光0 | 来源:发表于2020-02-23 20:26 被阅读0次

面试被问到为什么非静态内部类为什么会持有外部类的引用,一时语塞,只知道有这么回事,但是没有具体去调研,这次就简单的分析下。


分析

  1. 先做个简单的类
// InnerClassReference.java
public class InnerClassReference {
    private InnerClass clazz = new InnerClass();

    private class InnerClass {
    }
}
  1. javac编译成*.class文件看一下效果,这里有2个类

这是IDE自带的decompiler,语法是不符合java规范的,能看出个大概

// InnerClassReference.class
public class InnerClassReference {
    private InnerClassReference.InnerClass clazz = new InnerClassReference.InnerClass();
    public InnerClassReference() {}
    private class InnerClass {
        private InnerClass() {}
    }
}

// InnerClassReference$InnerClass.class
class InnerClassReference$InnerClass {
    private InnerClassReference$InnerClass(InnerClassReference var1) {
        this.this$0 = var1;
    }
}

可以看到在InnerClass.class中,构造方法在编译的时候添加了一个参数,这个参数就是外部类的实例!
所以“非静态内部类为什么会持有外部类的引用”是发生在编译阶段!

举一反三

同理,内部类可以访问外部类的成员变量也是这个道理,可以理解为通过this$0来访问外部类的成员变量。

引用

深入理解Java中为什么内部类可以访问外部类的成员
源码GitHub(欢迎star,follow)

相关文章

  • 内存泄漏解析

    常识 非静态内部类(包括匿名内部类:)默认会持有外部类的引用 静态内部类不会持有外部类的引用 静态存储区(存储静态...

  • Java 内存泄漏场景整理(2)

    非静态内部类的静态实例 非静态内部类会持有外部类实例的引用,如果非静态内部类的实例是静态的,就会间接地长期维持着外...

  • 关于静态内部类

    静态内部类与非静态内部类的区别 非静态内部类会隐式持有外部类的引用,可能引起内存泄漏。 静态内部类只能调用外部类的...

  • Java基础(1 - 15)

    目录 1,equals与==的区别;2,静态内部类、内部类、匿名内部类,为什么内部类会持有外部类的引用?持有的引用...

  • Android线程泄漏场景以及解决办法

    1.非静态内部类的静态实例 非静态内部类会持有外部类的引用,如果非静态内部类的实例是静态的,就会长期的维持着外部类...

  • (Android)最新2017安卓面试题级答案(精选版)

    JAVA 相关 1.静态内部类、内部类、匿名内部类,为什么内部类会持有外部类的引用?持有的引用是this?还是其它...

  • Java基础

    Java相关 1.静态内部类、内部类、匿名内部类,为什么内部类会持有外部类的引用?持有的引用是this?还是其它?...

  • 面试题2

    JAVA 相关 1.静态内部类、内部类、匿名内部类,为什么内部类会持有外部类的引用?持有的引用是this?还是其它...

  • 2019 Android 精选版面试题级答案(Android+J

    JAVA 相关 1.静态内部类、内部类、匿名内部类,为什么内部类会持有外部类的引用?持有的引用是this?还是其它...

  • 趁疫情赶紧复习!Android 精选版面试题级答案(Androi

    JAVA 相关 1.静态内部类、内部类、匿名内部类,为什么内部类会持有外部类的引用?持有的引用是this?还是其它...

网友评论

    本文标题:非静态内部类为什么会持有外部类的引用

    本文链接:https://www.haomeiwen.com/subject/vdksqhtx.html