静态内部类可避免持有外部类引用;需访问外部类时用WeakReference;及时解绑引用;优先传值而非传引用。

静态内部类切断引用链
非静态内部类会自动生成一个名为 this$0 的隐式字段,强持有外部类实例。只要内部类对象还活着,外部类就无法被回收。解决最直接的方式是把内部类声明为 static。这样它不再依赖外部类实例,也不再生成 this$0 字段。适用于不需要访问外部类成员变量或方法的场景,比如工具型、纯逻辑型内部类。
弱引用包装外部类实例
当内部类确实需要访问外部类数据,又不能改成 static 时,可用 WeakReference 手动管理引用。在内部类中不直接持外部类 this,而是保存 WeakReference。调用前检查 outerRef.get() != null,避免空指针;GC 触发后,外部类可正常回收。适合回调监听器、异步任务等长生命周期内部类。
及时清理或解绑引用
对已创建的非静态内部类实例,在其使命结束时主动断开与外部类的关联。例如在 onDestroy()(Android)、close() 或自定义销毁方法中:将内部类持有的外部类引用置为 null,清空回调列表,取消注册监听器。这不是被动等待 GC,而是主动释放强引用路径,尤其适用于持有 Handler、Thread、TimerTask 等易导致泄漏的组件。
优先使用局部变量替代成员引用
若内部类只需读取外部类某个状态值(如配置、ID、标志位),不要直接访问 Outer.this.flag,而是在构造时把该值作为参数传入,并用 final 局部变量 捕获。这样内部类只持有不可变值,不延长外部类生命周期。注意:Java 8+ 已放宽 final 限制,实际只需“事实不变”(effectively final)即可。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











