如下代码
package com.plbear.leakcanary
import android.content.Intent
import android.os.Bundle
import android.os.PersistableBundle
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
...
inner class Data {
var a = 1
}
}
编译之后可以看到Data是被单独编译为一个class文件的
看一下Data.class的内容
package com.plbear.leakcanary;
import kotlin.Metadata;
/* compiled from: MainActivity.kt */
public final class MainActivity$Data {
private int a = 1;
final /* synthetic */ MainActivity this$0;
public MainActivity$Data(MainActivity this$02) {
this.this$0 = this$02;
}
public final int getA() {
return this.a;
}
public final void setA(int i) {
this.a = i;
}
}
所以能明确看到,内部类持有外部类的引用,MainActivity被当做第一个参数传进去。
但是内部类为什么要持有外部类的引用呢?
我想大概有这么几点考虑(非标准答案,我自己的思考,欢迎打脸)
- 内部类需要访问外部类的方法,成员变量,所以必须持有一个引用才能使用
- Java的父类只能有一个,内部类在一定程度上,实现了『继承』多个父类的逻辑。