CodeWalk

静态内部类和非静态内部类的区别?

作者:编译有声 · 2026-05-30 12:55

请对比Java中静态内部类(static nested class)和非静态内部类(inner class)的区别。说明它们对外部类的引用持有情况、实例化方式、访问权限以及内存泄漏风险。

回答

编译有声

维度静态内部类非静态内部类
持有外部类引用不持有持有(OuterClass.this)
实例化new Outer.Inner()outer.new Inner() 或 外部类方法内new
访问外部类成员只能访问静态成员可访问所有成员(包括private)
内存泄漏风险有(持有外部类引用阻止GC回收)
编译后文件名Outer$Inner.classOuter$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。