前言 下面简单记录一下内部类,静态内部类以及匿名内部类之间的...

收录时间:
2026-06-12
自动化商城,供应全新正品自动化零件
笔友城堡 - 可定义的个人主页

前言

下面简单记录一下内部类静态内部类以及匿名内部类之间的区别,这也是面试常问的知识点。

记录于此,方便自己查阅和学习。

正文

内部类

定义在类中的类就叫内部类。

比如下面Inner类是定义在Outer中。

class Outer {
    int x = 10;
    class Inner {
        void print() {
            System.out.println(x); // 可直接访问外部类成员
        }
    }
}

特点

  1. 持有外部类对象的引用

  2. 可以直接访问外部类的所有成员(包括 private

  3. 不能定义static成员(除非static final)

使用方式

Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();

注意:Inner 内部会隐式保存 Outer.this

静态内部类

定义在类内部且使用static修饰的内部类叫静态内部类。

class Outer {
    static int x = 10;
    static class StaticInner {
        void print() {
            System.out.println(x); // 只能访问静态成员
        }
    }
}

特点

  1. 不依赖外部类实例

  2. 不能访问外部类的非静态成员

  3. 可以定义静态成员

  4. 类似一个“独立类”

使用方式

Outer.StaticInner inner = new Outer.StaticInner();

使用场景

  • Builder 模式

  • 工具类

  • 与外部类强相关,但不依赖实例状态

匿名内部类

没有类名,在创建对象时直接定义的类

Runnable r = new Runnable() {
    @Override
    public void run() {
        System.out.println("run");
    }
};

特点

  1. 本质是局部内部类

  2. 自动持有外部类引用

  3. 只能使用一次

  4. 可访问:外部类成员、final的局部变量

限制

  • 不能定义构造方法

  • 不能定义静态成员

  • 可读性较差(代码膨胀)

内存泄漏风险

内部类存在内存泄露问题

class Activity {
    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            // ...
        }
    };
}

问题:

  • Handler 持有 Activity 引用

  • MessageQueue 延迟消息 → Activity 无法回收

  • 造成内存泄漏

正确做法:

使用静态内部类 + WeakReference

static class MyHandler extends Handler {
    private final WeakReference<Activity> ref;
}

总结

类型是否持外部类引用能否访问外部实例成员能否定义 static 成员典型用途
普通类通用业务类
内部类强依赖外部对象
静态内部类工具类 / Builder
匿名内部类回调 / 一次性实现

参考文章

AI

特别声明

本站笔友城堡提供的都来源于网络,不保证外部链接的准确性和完整性,同时,对于该外部链接的指向,不由笔友城堡 实际控制,在 2026-06-12 收录时,该网页上的内容,都属于合规合法,后期网页的内容如出现违规,可以直接联系网站管理员进行删除, 笔友城堡不承担任何责任。

相关网址

笔友城堡 - 可定义的个人主页

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

none
暂无评论...