内部类是 Java 面向对象封装特性的 “进阶玩法”,是框架源码的高频设计手段。它能将与外部类强关联的逻辑封装在内部,既提升代码内聚性,又能突破封装限制灵活访问外部类私有成员。不少开发者觉得内部类难理解,核心是没理清它的类型和适用场景。本文将按 “核心价值→类型解析→实战用法→避坑指南” 的逻辑,把内部类的知识点讲透,帮你彻底搞懂这个 “看似复杂,实则好用” 的特性。
一、先搞懂:为什么需要内部类?
先看一个场景:设计 “汽车” 类,汽车包含 “发动机”,发动机的逻辑仅服务于汽车,且需要访问汽车的私有属性(如油箱容量)。如果把发动机写成独立类,要么暴露汽车的私有属性,要么代码分散;而内部类能完美解决这个问题 ——把依赖强、范围小的逻辑封装在外部类内部,既保证封装性,又简化访问。
内部类的核心价值:
- 高内聚:逻辑紧密相关的代码放在一起(如发动机→汽车),代码结构更清晰;
- 突破封装:内部类可直接访问外部类的私有成员(属性 / 方法),无需暴露外部类的私有接口;
- 隐藏实现:内部类对外不可见(除非主动暴露),减少全局类的数量,降低命名冲突风险;
- 灵活扩展:匿名内部类可快速实现接口 / 继承类,简化 “临时使用一次” 的场景(如接口回调)。
二、四大内部类:定义、语法、场景
Java 内部类分 4 种:成员内部类、静态内部类、局部内部类、匿名内部类,以下逐一拆解。
2.1 成员内部类
定义:
直接定义在外部类中,与外部类的成员变量、成员方法同级,无static修饰 —— 相当于外部类的 “非静态成员”。
核心特点:
- 依赖外部类对象:必须先创建外部类对象,才能创建成员内部类对象;
- 可直接访问外部类的所有成员:包括非静态和静态成员;
- 不能定义静态成员(JDK16 前):JDK16 后允许定义静态常量,但不建议。
创建方式
| 场景 | 语法 | 说明 |
|---|---|---|
| 在外部类内部 | new 内部类名() | 可直接创建,因为已有隐式的外部类 this |
| 在外部类外部 | 外部类对象.new 内部类名() | 必须通过已存在的外部类实例创建 (如 car.new Engine()) |
| 推荐做法 | 通过外部类提供的 getXxx() 方法获取 | 封装创建逻辑,隐藏内部类细节 |
调用方式
- 创建内部类对象后,通过
内部类对象.方法()或内部类对象.属性直接调用; - 内部类方法内部可直接使用外部类的字段和方法。
代码示例(汽车 + 发动机):
// 外部类:汽车 public class Car { // 私有属性:仅汽车自己可见 private int oilTankCapacity = 50; // 油箱容量(L) pr