内部类分类与区别
面试官问:"Java 有哪几种内部类?"
候选人小宋答:"有静态内部类和非静态内部类,还有匿名内部类。"
面试官追问:"还有呢?"
小宋:"...成员内部类?"
面试官写了一段代码:
"这四种内部类有什么区别?"
小宋答不上来。
【面试官心理】 这道题看似简单,但四种内部类的区别是 Java 基础中的进阶点。能说出"是否持有外部类引用"和"是否独立编译"的候选人,说明真正理解了内部类的设计意图。
一、四种内部类分类 🔴
二、成员内部类 🔴
2.1 基本语法
2.2 核心特性:持有外部类引用
重要:非静态内部类持有外部类引用,这意味着:
- 内部类对象依赖于外部类对象存在
- 一个外部类可以有多个内部类实例,每个都持有同一个外部类引用
三、静态内部类 🔴
3.1 基本语法
3.2 与成员内部类的核心区别
💡
能用静态内部类就不用成员内部类。成员内部类持有外部类引用,如果被外部持有引用(如作为回调),可能导致外部类无法被 GC 回收,产生内存泄漏。Android 开发中这个问题尤为突出。
四、局部内部类 🔴
4.1 基本语法
4.2 作用域限制
局部内部类只在定义它的方法内可见,其他方法无法访问。
五、匿名内部类 🔴
5.1 基本语法
5.2 匿名内部类的限制
5.3 匿名内部类的继承意义
六、面试追问链
面试官:"内部类编译后生成几个 class 文件?"
面试官:"局部内部类和匿名内部类有什么区别?"
【面试官心理】
问"生成几个 class 文件"能直接测试候选人对编译器的了解程度。能说出 $ 分隔符和编号规则的候选人,说明研究过 class 文件结构。