别把内部类当死记硬背的八股文

很多准备面试的程序员在复习内部类时,习惯去背“内部类有哪几种”“各自能访问什么”的结论。但一到面试被问到“为什么普通成员内部类能直接拿到外部类的私有属性”或者“方法里定义的局部类加上 final 修饰的参数到底有什么实际用处”时,就开始卡壳。这门课解决的就是这种只知其表不知其里的能力缺口。它不是把知识点简单罗列,而是针对面试官最容易挖坑的几个核心问题,直接从编译和语法约束的角度去拆解。如果你之前写业务代码时几乎没主动用过内部类,只是在看源码时偶尔遇到,那这节课正好帮你把这些零散的认知补齐。

先从访问限制看懂内外类关系

对于有一定语法基础但底子不扎实的转岗者或查漏补缺者,建议先从普通成员内部类与外部类的访问关系看起。很多人在写代码时会有一个疑问:外部类可以随意访问内部类的私有成员,内部类也能直接调用外部类的私有属性,这种互相放行的底层逻辑到底是什么?看完这块内容你要弄清楚,这并不是单纯的语法特权,而是编译器在背后生成了附加的访问方法。接着必须重点看静态成员内部类的访问限制,这是面试的重灾区。你要能准确区分静态内部类在访问外部类普通成员和静态成员时的差异,搞懂为什么静态上下文里拿不到外部类的非静态引用。把这两块弄明白,关于内外类互相访问的题目你就不会答错。

匿名内部类的使用场景与配套练习

课程最后落脚在匿名内部类的使用时机上,这也是实际开发中唯一你会高频手写内部类的场景。学完这一节,你应该能独立回答出:在没有引入 Lambda 表达式之前,我们在实现回调接口或者线程任务时为什么要直接 new 接口,以及这种写法在编译后到底生成了什么结构的类。资料配合练习时,不要只用眼睛看视频,必须打开编辑器自己敲一遍。先写一个普通成员内部类,故意在外部类实例化它,观察调用栈;然后再写一个方法内部类,尝试引用方法的局部变量,把变量前后的修饰符改动一下,看编译器报什么错。通过这种实打实的报错练习,你才能把面试题里的死结论变成自己脑子里的活规则,而不是到了考场上靠运气去蒙。

课程目录

1 方法内部能不能定义类? (04:20)
2 说出定义内部类的方式 (17:22)
3 普通成员内部类能不能直接访问外部类的普通成员? (06:13)
4 静态成员内部类能不能直接访问外部类普通成员?能不能访问外部类 (06:02)
5 什么时候会使用匿名内部类? (02:11)