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

本文详细解析了Java中普通内部类如何持有外部类的引用。通过具体示例介绍了内部类通过构造方法接收外部类实例的过程,并展示了编译后的字节码文件,帮助读者深入理解内部类的工作机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

参考:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tinyvampirepudge

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值