静态内部类和非静态内部类的区别?
请对比Java中静态内部类(static nested class)和非静态内部类(inner class)的区别。说明它们对外部类的引用持有情况、实例化方式、访问权限以及内存泄漏风险。
回答
编译有声
| 维度 | 静态内部类 | 非静态内部类 |
|---|---|---|
| 持有外部类引用 | 不持有 | 持有(OuterClass.this) |
| 实例化 | new Outer.Inner() | outer.new Inner() 或 外部类方法内new |
| 访问外部类成员 | 只能访问静态成员 | 可访问所有成员(包括private) |
| 内存泄漏风险 | 无 | 有(持有外部类引用阻止GC回收) |
| 编译后文件名 | Outer$Inner.class | Outer$Inner.class |
| static修饰 | 有static | 无static |
代码示例:
public class Outer {
private int x;
private static int y;
static class StaticInner {
void test() {
// System.out.println(x); // 编译错误
System.out.println(y); // 正常
}
}
class Inner {
void test() {
System.out.println(x); // 正常
System.out.println(y); // 正常
}
}
}
内存泄漏:非静态内部类隐式持有外部类引用,如果内部类生命周期比外部类长(如将内部类实例传给静态变量),会导致外部类无法被GC回收。常见于Android中Activity内的匿名Handler导致的内存泄漏。
建议:如果内部类不需要访问外部类实例成员,尽量声明为static。