Java 中有多种内部类,其实平时经常用到,这里整理一下,用到比较多都是Android的例子。
1.成员内部类
这是最常见的一种内部类,大部分为了方便而写在一个文件里面的类基本都属于这样的,
优点:使用灵活,不用写太多的文件
缺点:在外部创建内部类实例需要先创建一个Container的实例
- 1
- 1
故比较适合只在当前类里使用的,比如某个自定义的 View
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
2. 静态内部类
- 1
- 1
优点:同样是使用方便,和1相比,避免内存泄露
缺点:不能灵活的使用非静态的实例,所在的 OuterClass 的很多类成员属性都不能直接使用。
使用场景:类内部使用的Java Bean常用
关于泄露
非静态内部类的对象默认包含了它的Container的引用,比如:
- 1
- 2
- 3
- 1
- 2
- 3
B的对象中默认有一个A的引用,垃圾回收的时候,如果处理不当,有可能导致A的对象不能被回收,导致内存泄漏。
换成静态内部类后,默认引用就没有了,比如:
- 1
- 2
- 3
- 1
- 2
- 3
泄露栗子:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
leakInstance由于是一个内部类,持有了activity的引用,此时如果activity被销毁重建,那么原先的activity就会被leakInstance持有,不能被回收。
所以建议改成
- 1
- 1
3. 局部内部类
在方法内部创建的类,生命周期只存在于方法周期内,少用
4. 匿名内部类
优点:使用简单,方便快捷,实现接口的实例比较方便
缺点:使用太多的话会造成代码可读性差
栗子:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7