02 — 面向对象核心索引
定位: OOP 三大特性 + 抽象类/接口/内部类 — Java 管理复杂度的核心思想工具 面试高频度: ⭐⭐⭐⭐⭐
一、板块在体系中的位置
┌─────────────────────────────────────────────────────────────┐
│ OOP 在 Java 中的角色 │
│ │
│ 01-语言基础 (类型系统 → 程序的"名词") │
│ │ │
│ ▼ │
│ 02-面向对象 (封装/继承/多态 → 程序的"组织方式") ← 在这里 │
│ │ │
│ ├──→ 03-集合框架 (OOP 的典型应用 — 接口/实现分离) │
│ ├──→ 04-泛型与注解 (对类型的进一步抽象) │
│ └──→ 设计模式 (OOP 原则的具体实践) │
└─────────────────────────────────────────────────────────────┘二、知识全景图
┌─────────────────────────────────────────────────────────────┐
│ Java 面向对象核心全景图 │
│ │
│ ┌──────────────────────────────────────────────┐ │
│ │ 面向对象三大特性 │ │
│ │ │ │
│ │ 封装 ─── 隐藏实现,暴露接口 → 降低复杂度 │ │
│ │ 继承 ─── 代码复用,is-a 关系 → ⚠️ 过度使用問題 │ │
│ │ 多态 ─── 同一接口不同实现 → 框架设计的基石 │ │
│ └──────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────┐ ┌────────────────────────┐ │
│ │ 抽象类 vs 接口 │ │ 内部类 │ │
│ │ │ │ │ │
│ │ 抽象类:模板方法模式 │ │ 成员内部类 → 访问外部类 │ │
│ │ 接口:契约设计+多重继承 │ │ 匿名内部类 → 简化回调 │ │
│ │ JDK8+ 接口升级(default) │ │ 静态内部类 → 辅助类 │ │
│ └──────────────────────────┘ └────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 核心考点: │ │
│ │ ① 多态的实现原理(静态分派 vs 动态分派) │ │
│ │ ② 抽象类 vs 接口的应用场景选择 + Java 8 接口变化 │ │
│ │ ③ 内部类为什么持有外部类引用(非静态内部类) │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘三、子专题导航
| # | 主题 | 面试频率 | 核心内容 |
|---|---|---|---|
| **三大特性(封装继承多态)** | 三大特性 | ⭐⭐⭐⭐⭐ | 封装动机、继承的利与弊、多态的实现原理(虚方法表) |
| **抽象类与接口** | 抽象类与接口 | ⭐⭐⭐⭐⭐ | 设计动机差异、JDK8+ 接口进化、如何选择 |
| **内部类与匿名类** | 内部类与匿名类 | ⭐⭐⭐ | 为什么需要内部类、持有外部类引用的机制、编译后结构 |
四、核心考点速记
考点 1:多态的实现原理
编译时(静态分派):
obj.method(args) → 根据"声明类型"确定方法签名(重载)
运行时(动态分派):
obj.method() → 根据"实际类型"在虚方法表中查找具体实现(重写)
例子:
Animal a = new Dog();
a.makeSound(); // 编译看 Animal,运行看 Dog 的方法表考点 2:抽象类 vs 接口选择
| 场景 | 选抽象类 | 选接口 |
|---|---|---|
| 核心是"是什么"(is-a) | ✅ 模板方法 | ❌ |
| 核心是"能做什么"(can-do) | ❌ | ✅ 契约设计 |
| 需要共享状态(字段) | ✅ | ❌ |
| 需要多重继承 | ❌ | ✅ |
| JDK8+ 有默认方法 | — | ✅ |
五、面试高频追问一览
| 追问 | 关联笔记 | 频次 |
|---|---|---|
| Java 是单继承,怎么实现类似多继承的效果? | **抽象类与接口** | ⭐⭐⭐⭐⭐ |
| 静态方法能重写吗?private 方法呢? | **三大特性(封装继承多态)** | ⭐⭐⭐⭐ |
| 内部类为什么可以访问外部类的 private 字段? | **内部类与匿名类** | ⭐⭐⭐ |
| Java 8 为什么要在接口中引入 default 方法? | **抽象类与接口** | ⭐⭐⭐⭐ |
📚 相关文件
- **01-语言基础** — OOP 的类型基础
- **集合索引** — OOP 接口/实现分离的典型应用
- **Java文库设计文档** — 返回总纲