一日一钱,千日一千。绳锯木断,水滴石穿。

普通内部类持有外部类引用的原理

Posted on By TinyVampirePudge

普通内部类持有外部类引用的原理

内部类虽然和外部类写在同一个文件中, 但是编译完成后, 还是生成各自的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文件

生成的.class文件位置

3、查看.class文件 给Android Studio安装插件Java Bytecode Editor, 使用插件查看这生成的.class文件,结果如下: Parcen1.calss Parcel1_Contents.class

Parcel1_Destination.class

如上所示,箭头所指的地方,说明普通内部类在编译之后,编译器会通过构造器传递外部类的引用进去。

参考:

https://www.jianshu.com/p/7c3ad6e6a5b1

https://blog.csdn.net/kwame211/article/details/77677662