博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java内部类持有外部类的引用详细分析与解决方案
阅读量:6368 次
发布时间:2019-06-23

本文共 2043 字,大约阅读时间需要 6 分钟。

在中内部类的定义与使用一般为成员内部类与匿名内部类,他们的对象都会隐式持有外部类对象的引用,影响外部类对象的回收。

GC只会回收没有被引用或者根集不可到达的对象(取决于GC),内部类在生命周期内始终持有外部类的对象的引用,造成外部类的对象始终不满足GC的回收条件,反映在内存上就是内存泄露。(如,中Activity的内存泄露)

解决方案为

1.将内部类定义为static

2.用static的变量引用匿名内部类的实例

测试代码

[java]
  1. class Outer {  
  2.     class Inner {  
  3.         public String publicString = "Inner.publicString";  
  4.     }  
  5.   
  6.     Other anonymousOther = new Other() {  
  7.         public String publicString = "Anonymous Other.publicString";  
  8.     };  
  9.     public Other getAnonymousOther() {  
  10.         return anonymousOther;  
  11.     }  
  12.   
  13.     Other Other = new Other();  
  14.     public Other getOther() {  
  15.         return Other;  
  16.     }  
  17. }  
  18.   
  19. class Other {  
  20.     public String publicString = "Other.publicString";  
  21. }  

调用代码

[java]
  1. public static void main(String args[]) {  
  2.         printField(new Outer().new Inner());  
  3.         System.out.println("\t");  
  4.         printField(new Outer().getAnonymousOther());  
  5.         System.out.println("\t");  
  6.         printField(new Outer().getOther());  
  7.     }  

 

测试结果

[plain]
  1. Class: at.miao.Outer$Inner  
  2. 变量: publicString 值为 Inner.publicString  
  3. 变量: this$0 值为 at.miao.Outer@456c5f50  
  4.       
  5. Class: at.miao.Outer$1  
  6. 变量: publicString 值为 Anonymous Other.publicString  
  7. 变量: this$0 值为 at.miao.Outer@10e80317  
  8. Class: at.miao.Other  
  9. 变量: publicString 值为 Other.publicString  

可以看到内部类与匿名内部类的实例都有一个外部类类型的名为this$0的变量指向了外部类的对象。

加上static之后,代码为

[java]
  1. class Outer {  
  2.     static class Inner {  
  3.         public String publicString = "Inner.publicString";  
  4.     }  
  5.   
  6.     static Other anonymousOther = new Other() {  
  7.         public String publicString = "Anonymous Other.publicString";  
  8.     };  
  9.   
  10.     public Other getAnonymousOther() {  
  11.         return anonymousOther;  
  12.     }  
  13.   
  14.     Other Other = new Other();  
  15.     public Other getOther() {  
  16.         return Other;  
  17.     }  
  18. }  
  19.   
  20. class Other {  
  21.     public String publicString = "Other.publicString";  
  22. }  

调用代码

[java]
  1. public static void main(String args[]) {  
  2.         printField(new Outer.Inner());  
  3.         System.out.println("\t");  
  4.         printField(new Outer().getAnonymousOther());  
  5.         System.out.println("\t");  
  6.         printField(new Outer().getOther());  
  7.     }  

 

测试结果

[java]
  1. Class: at.miao.Outer$Inner  
  2. 变量: publicString 值为 Inner.publicString  
  3.       
  4. Class: at.miao.Outer$1  
  5. 变量: publicString 值为 Anonymous Other.publicString  
  6.       
  7. Class: at.miao.Other  
  8. 变量: publicString 值为 Other.publicString  

可以看到静态内部类实例、static引用的匿名内部类的实例未引用外部类的实例。

 

转载地址:http://gtema.baihongyu.com/

你可能感兴趣的文章
迎接互联网的明天--玩转3D Web
查看>>
心态成就财富
查看>>
TeeChart 4.0.2009.62335 不过期的方法
查看>>
云安全 安全领域的最大热点之一
查看>>
微软面试题:正则表达式提取链接地址
查看>>
Java MD5 加密加强版
查看>>
当时遇到的主要难点在于TextView的内容不会刷新改变值,今天终于通过Timer和Handler实现了,分享给大家...
查看>>
CentOS卸载系统自带的OpenJDK并安装Sun的JDK的方法
查看>>
二路归并排序 代码实例
查看>>
【转】理解 pkg-config 工具
查看>>
【转】Android中intent传递对象和Bundle的用法
查看>>
TCP/IP详解学习笔记(3)-IP协议,ARP协议,RARP协议
查看>>
什么是automatic variable?
查看>>
求数组的最长子数组之和的最大值
查看>>
Aptana Studio 介绍
查看>>
FireFox Personas for the NetBeans Platform
查看>>
HTC 惊艳 S710e G11 与电脑连接方式
查看>>
G13 智能拨号不好用的解决方法
查看>>
enum 枚举的使用(转)
查看>>
JDK5.0新特性系列---11.6线程 BlockingQueue
查看>>