普通内部类持有外部类引用的原理
内部类虽然和外部类写在同一个文件中, 但是编译完成后, 还是生成各自的class文件,内部类通过this访问外部类的成员。
1、编译器自动为内部类添加一个成员变量, 这个成员变量的类型和外部类的类型相同, 这个成员变量就是指向外部类对象(this)的引用;
2、编译器自动为内部类的构造方法添加一个参数, 参数的类型是外部类的类型, 在构造方法内部使用这个参数为内部类中添加的成员变量赋值;
3、在调用内部类的构造函数初始化内部类对象时,会默认传入外部类的引用。
示例演示:
1、先定义一个包含普通类的内部类
public class Parcel1 {
class Contents{
private int i = 11;
public int value() {
return i;
}
}
class Destination{
private String label;
public Destination(String whereTo) {
// TODO Auto-generated constructor stub
label = whereTo;
}
String readLabel(){
return label;
}
}
public void ship(String dest) {
Contents c = new Contents();
Destination d = new Destination(dest);
System.out.println(d.readLabel());
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Parcel1 p = new Parcel1();
p.ship("Tasmania");
}
}
2、编译运行下,获取到.class文件
3、查看.class文件
给Android Studio安装插件Java Bytecode Editor, 使用插件查看这生成的.class文件,结果如下:
如上所示,箭头所指的地方,说明普通内部类在编译之后,编译器会通过构造器传递外部类的引用进去。
参考: