章节导读
本章定位:继承与多态是面向对象程序设计的核心支柱,抽象类与接口是系统架构的契约基石。本章将深入 Java 单继承机制、方法重写的虚方法表与动态绑定、super/final 关键字的限制语义、向上转型与向下转型的风险控制,以及抽象类与接口的 JDK 8 新范式。本章内容直接对应企业面试的高频考点和实际开发中的架构设计基础。
飞翔科技场景导入
飞翔科技技术部正在重构"员工薪资管理系统"。架构师白歌发现,当前代码大量重复——Manager 类和 Developer 类各自独立实现,连 name、id、salary 这些公共字段都在每个类里写了一遍。
白歌在周会上指出:"这不是面向对象,这是面向复制粘贴。我们需要用继承提取公共部分到
Employee基类,用多态统一薪资计算逻辑。"
实习生小崔接下了这个重构任务。重构过程中他又遇到新问题——正式员工要算五险一金、绩效系数、工龄补贴,实习生只需日薪 × 出勤天数。两者的 calculateSalary() 实现完全不同,但编译器从不提醒遗漏。架构师白歌在白板上画了一行字:
"你需要的是把方法签名定死,让编译器帮你检查遗漏——用抽象类或接口来定义这个契约。"
本章正是围绕这次重构展开,从小崔的踩坑到白歌的设计决策,一步步揭示继承、多态与抽象的力量。
学习目标
完成本章学习后,你应当能够:
- 使用
extends建立合理的类继承层次,理解 Java 单继承的设计考量 - 正确重写父类方法,理解
@Override注解与虚方法表(vtable)的底层机制 - 使用
super在子类中访问父类的构造方法、成员变量和成员方法 - 理解多态的三前提与"编译看左边、运行看右边"的核心原则
- 使用
instanceof进行安全的类型判断与向下转型 - 掌握
final修饰类、方法、变量的语义,理解不可变性设计 - 区分向上转型(自动安全)与向下转型(强制、需检查)的场景与风险
- 准确区分抽象类与接口的语法差异和设计意图
- 掌握 JDK 8 接口中
default方法和static方法的正确用法 - 给定业务场景,判断应该用抽象类还是接口
知识图谱
章节结构
| 序号 | 文件 | 核心内容 | 难度 | 建议学时 |
|---|---|---|---|---|
| 1 | 继承.md | extends、单继承、Object 根类、方法重写、虚方法表 | ★★★ | 3 |
| 2 | super关键字.md | 调用父类构造、super.字段/方法、super vs this | ★★☆ | 1.5 |
| 3 | 多态.md | 三前提、编译/运行类型、instanceof、参数/返回值多态 | ★★★★ | 3 |
| 4 | final关键字.md | final 类/方法/变量、不可变类、String 的 final 设计 | ★★☆ | 2 |
| 5 | 向上转型与向下转型.md | 自动上转、强制下转、ClassCastException、安全检查 | ★★★ | 2 |
| 6 | 抽象类.md | abstract 关键字、抽象方法、构造方法、模板方法模式 | ★★★ | 3 |
| 7 | 接口.md | interface、多实现、default/static 方法(JDK 8) | ★★★ | 3 |
| 8 | 抽象类与接口对比.md | 语法对比表、选型决策、JDK 8 影响、面试考点 | ★★★ | 2 |
学习路线建议
本章有两条并行学习线索:继承链(1→5)聚焦"is-a"关系和运行时多态——这是面试区分度的核心区,多态一节务必投入 3 小时以上并手绘虚方法表;抽象链(6→8)聚焦"can-do"契约——抽象类与接口对比是所有架构设计面试的必问题。建议学完继承链建立类层次直觉后,再进入抽象链理解行为契约。
角色导览
| 角色 | 身份 | 本章职责 |
|---|---|---|
| 大翔 | 飞翔科技技术总监 / CTO | 代码审查、抛出 OOP 设计原则、出面试题 |
| 白歌 | 飞翔科技系统架构师 | 讲授继承与抽象机制、制定接口规范 |
| 小崔 | 飞翔科技后端开发 | 重构薪资系统、踩多态转型的坑 |
| 孔蓝 | 飞翔科技资深工程师 | Code Review、发现设计缺陷 |
| 黄俪 | 飞翔科技前端开发 | 对比 TypeScript 接口与 Java 接口 |
面试分值分布
| 知识点 | 出现频率 | 典型题型 |
|---|---|---|
| 多态(动态绑定) | 98% | 画虚方法表、判断输出、"编译左运行右" |
| 抽象类 vs 接口 | 95% | 语法对比、JDK 8 影响、设计场景选型 |
| 方法重写 | 90% | @Override 作用、协变返回、访问修饰符限制 |
| final 关键字 | 85% | String 为什么是 final?空白 final |
| 向上/向下转型 | 80% | 判断是否编译通过、ClassCastException |
| super 关键字 | 75% | super() 为什么必须在第一行? |
| 继承 vs 组合 | 70% | 设计原则:优先使用组合 |
前置知识
学习本章前,请确保已掌握:
| 知识点 | 来源 | 关键检查点 |
|---|---|---|
| 类与对象的定义 | 第6章 | class 定义、new 创建、成员变量与方法 |
| 构造方法 | 第6章 | 构造方法特性、默认构造、重载 |
| 访问修饰符 | 第6章 | private/default/protected/public 权限矩阵 |
| static 关键字 | 第6章 | 静态与实例成员的区别 |
| 方法重载 | 第6章 | 重载规则(编译期多态) |
| 参数传递机制 | 第6章 | 值传递、引用类型传递 |
| JVM 内存模型 | 第6章 | 堆、栈、方法区基础 |
JDK 版本说明
本章内容基于 JDK 8,涵盖以下版本特性:
| JDK 版本 | 引入特性 | 本章涉及 |
|---|---|---|
| JDK 1.0 | extends、super、final、abstract class | 全部涉及 |
| JDK 1.1 | 内部类访问控制 | 不涉及 |
| JDK 5 | @Override 注解、协变返回 | 方法重写 |
| JDK 8 | 接口 default/static 方法 | 接口、抽象类 vs 接口对比 |
| JDK 16+ | instanceof 模式匹配 | 仅标注,不作展开 |
大翔(CTO)寄语:继承不是用来省代码的,是用来表达"is-a"关系的。如果一个类不需要父类的所有公共方法,那它就不应该继承那个父类——优先考虑组合。接口不是用来套模板的,是用来定义行为契约的——当你发现自己在接口里写了 10 个方法而实现类只需要其中 2 个,说明该拆接口了。
飞翔科技业务场景概览
本章所有代码示例均围绕以下业务场景展开:
| 场景 | 涉及知识点 | 说明 |
|---|---|---|
| 员工薪资重构 | 继承、super、方法重写 | Employee → Manager/Developer 层次 |
| 统一薪资计算 | 多态、抽象类 | Employee[] 统一调用 calculateSalary() |
| 支付结算系统 | 接口(Payable) | 正式员工、实习生、外包共享支付契约 |
| 报表打印系统 | 接口(Printable) | 薪资单、考勤表、绩效报告统一输出 |
| 权限与部门管理 | final | 常量定义、不可变配置类 |
| 类型安全检查 | 向上/向下转型、instanceof | 从集合取出元素的类型判定 |