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

简介: 内部类虽然和外部类写在同一个文件中, 但是编译完成后, 还是生成各自的class文件,内部类通过this访问外部类的成员。 1、编译器自动为内部类添加一个成员变量, 这个成员变量的类型和外部类的类型相同, 这个成员变量就是指向外部类对象(this)的引用;2、编译器自动为内部类的构造方法添加一个参数, 参数的类型是外部类的类型, 在构造方法内部使用这个参数为内部类中添加的成员变量赋值;3、在调用内部类的构造函数初始化内部类对象时,会默认传入外部类的引用。

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

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

相关文章
|
Java
内部类(下)匿名内部类,静态内部类的使用
内部类(下)匿名内部类,静态内部类的使用
77 0
静态内部类,实例内部类
我们创建了静态内部类,那么我们怎么能获取静态内部类对象呢? 这里我们知道静态变量是不依赖于对象的,所以不用先new一个Outclass1对象(讲到实例内部类会用),可以直接new OutClass.InnerClass()。
71 0
|
缓存 安全 Java
静态内部类单例
静态内部类单例
107 0
|
Java
5.2 内部类与外部类的关系:内部类对外部类的引用
5.2 内部类与外部类的关系:内部类对外部类的引用
144 0
|
Java
5.1 内部类与外部类的关系:内部类的实例化方式
5.1 内部类与外部类的关系:内部类的实例化方式
205 0
|
设计模式 Java
3.2 内部类的类型:静态内部类
3.2 内部类的类型:静态内部类
69 0
|
Java 程序员
2.2 为什么使用内部类:访问外部类的私有成员
2.2 为什么使用内部类:访问外部类的私有成员
227 0
java内部类——静态内部类
java内部类——静态内部类
|
安全
私有静态内部类实现线程安全的单例
利用私有静态内部类实现线程安全的单例
5963 0