AI面试总结:Serializable和Parcelable区别
前言 面试中也经常问到对象序列化,也就Android、Jav...
下面简单记录一下内部类,静态内部类以及匿名内部类之间的区别,这也是面试常问的知识点。
记录于此,方便自己查阅和学习。
比如下面Inner类是定义在Outer中。
class Outer { int x = 10; class Inner { void print() { System.out.println(x); // 可直接访问外部类成员 } } }
特点
持有外部类对象的引用
可以直接访问外部类的所有成员(包括 private)
不能定义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); // 只能访问静态成员 } } }
特点
不依赖外部类实例
不能访问外部类的非静态成员
可以定义静态成员
类似一个“独立类”
使用方式
Outer.StaticInner inner = new Outer.StaticInner();使用场景
Builder 模式
工具类
与外部类强相关,但不依赖实例状态
没有类名,在创建对象时直接定义的类
Runnable r = new Runnable() { @Override public void run() { System.out.println("run"); } };
特点
本质是局部内部类
自动持有外部类引用
只能使用一次
可访问:外部类成员、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 |
| 匿名内部类 | ✅ | ✅ | ❌ | 回调 / 一次性实现 |
本站笔友城堡提供的都来源于网络,不保证外部链接的准确性和完整性,同时,对于该外部链接的指向,不由笔友城堡 实际控制,在 2026-06-12 收录时,该网页上的内容,都属于合规合法,后期网页的内容如出现违规,可以直接联系网站管理员进行删除, 笔友城堡不承担任何责任。