一、为什么需要内部类?
内部类解决了三大核心问题:
- 强化封装:将仅服务于外部类的逻辑隐藏在其内部
- 直接访问特权:无缝访问外部类所有成员(包括private)
- 代码组织优化:关联类集中管理,减少命名冲突
二、四大内部类详解(附示例)
1. 成员内部类 - 与实例绑定
class Outer {
private String secret = "外部机密";
class Inner {
void revealSecret() {
System.out.println("访问外部私有变量: " + secret); // 直接访问外部类私有成员
}
}
}
// 使用示例
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner(); // 必须通过外部实例创建
inner.revealSecret(); // 输出: 访问外部私有变量: 外部机密
2. 静态嵌套类 - 独立存在
class Outer {
static class StaticNested {
void print() {
System.out.println("我是静态嵌套类,不依赖外部实例");
}
}
}
// 直接实例化
Outer.StaticNested nested = new Outer.StaticNested();
nested.print();
3. 局部内部类 - 方法内的秘密武器
class DataProcessor {
void process() {
class LocalFormatter { // 方法内定义的类
String format(String data) {
return "[" + data.toUpperCase() + "]";
}
}
System.out.println(new LocalFormatter().format("hello")); // 输出: [HELLO]
}
}
4. 匿名内部类 - 即用即弃的轻量实现
// 实现Runnable接口
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("匿名内部类线程启动");
}
}).start();
// 继承抽象类
new AbstractAction("保存") {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("执行保存操作");
}
};
三、核心差异对比表
类型 是否静态 访问外部成员 适用场景
成员内部类 × 直接访问 紧密关联外部实例的逻辑
静态嵌套类 √ 不可直接访问 工具类/独立功能模块
局部内部类 × 访问final变量 方法内复杂逻辑封装
匿名内部类 × 访问final变量 单次使用的接口实现
四、避坑指南:内存泄漏问题
// 危险操作:在长生命周期中持有内部类引用
class Outer {
class Inner {}
}
void createLeak() {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
// 即使outer不再使用,inner仍隐式持有outer的引用
// 导致outer无法被GC回收!
}
解决方案:
· 对生命周期长的内部类使用static修饰
· 必要时使用弱引用WeakReference
最佳实践:Android开发中,Handler内部类需声明为static,并通过WeakReference持有Activity引用,避免因未销毁的Handler导致Activity泄漏。
结语
掌握内部类的四种形态及其特性,能显著提升代码的架构能力。尤其在事件驱动编程(如Swing/Android)和设计模式实现中,内部类展现出不可替代的价值。使用时需权衡封装需求与内存安全,方能发挥其最大威力。

被折叠的 条评论
为什么被折叠?



