章节导读
本章定位:面向对象编程(OOP)是 Java 的灵魂,而类与对象是 OOP 的基石。本章从类与对象在 JVM 中的内存模型出发,系统讲解方法重载、构造方法链、this/static 语义、值传递机制,进而深入封装与访问控制,最后以内部类与枚举收官。本章覆盖 14 个知识点,总建议学时约 20 小时,是 Java 面试"送分题"的最大出题源。
飞翔科技场景导入
大二学生小崔在飞翔科技实习的第一天,导师白歌丢给他一份需求:开发一个员工考勤系统。小崔用面向过程思维吭哧吭哧写了 2000 行,每个新功能都要改十几个函数。架构师大翔看了一眼代码,笑了:"小崔,你这是在用 Java 写 C 啊。"
两周后,小崔用面向对象重构了整个系统——代码量减少 40%,新增一个"实习生"类型只需加 5 行代码。这不是故事,这是每个 Java 程序员的必经之路。
与此同时,飞翔科技的员工管理系统正面临访问控制问题:任何模块都能随意修改员工薪资字段。白歌拍板制定封装规范,而小崔发现匿名内部类配合枚举可以让事件处理和状态管理变得不可思议地简洁。
学习目标
完成本章学习后,你应当能够:
- 理解
class与new在 JVM 堆/栈中的内存布局,画出对象内存图 - 掌握方法重载的编译期决议规则,区分重载与重写
- 理解构造方法的链式调用和默认构造方法的生成机制
- 明确
this的本质(当前对象的引用)及其两种用法 - 区分
static的类级别与实例级别,理解静态代码块执行顺序 - 彻底掌握 Java 值传递的底层原理——这是面试 95% 频率的"死亡题"
- 用
private+ getter/setter 编写符合 JavaBean 规范的类 - 掌握四种访问修饰符的权限矩阵,根据场景正确选择
- 正确使用
package组织类、用import导入依赖、处理类冲突 - 区分四种内部类的定义位置、字节码文件名和适用场景
- 理解匿名内部类与 Lambda 表达式的关系
- 掌握枚举的本质(
final class extends Enum)及其线程安全单例用法
知识图谱
章节结构
| 序号 | 文件 | 核心内容 | 难度 | 建议学时 |
|---|---|---|---|---|
| 1 | 类与对象.md | class 定义、new 创建、堆栈内存、匿名对象 | ★★☆ | 2 |
| 2 | 方法定义与调用.md | 方法签名、return/void、重载规则、可变参数 | ★★☆ | 1.5 |
| 3 | 构造方法.md | 构造方法特性、默认构造、重载、this 调用 | ★★☆ | 1.5 |
| 4 | this关键字.md | 当前对象引用、成员访问、构造器调用 | ★★☆ | 1 |
| 5 | static关键字.md | 静态变量/方法、静态代码块、静态导入 | ★★★ | 1.5 |
| 6 | 参数传递.md | 值传递本质、基本/引用类型、String 不可变 | ★★★ | 2 |
| 7 | 封装.md | 数据隐藏、JavaBean 规范、getter/setter 校验 | ★★☆ | 2 |
| 8 | 访问修饰符.md | 四种修饰符权限矩阵、protected 详解 | ★★★ | 2 |
| 9 | package与import.md | 包声明、目录结构、import 机制、类冲突 | ★★☆ | 1.5 |
| 10 | 成员内部类.md | 持有外部引用、Outer$Inner.class、创建方式 | ★★☆ | 1.5 |
| 11 | 静态内部类.md | 不持有外部引用、Builder 模式、Map.Entry | ★★☆ | 1.5 |
| 12 | 局部内部类.md | 方法内定义、effectively final、作用域 | ★★☆ | 1 |
| 13 | 匿名内部类.md | 接口/抽象类实例化、Lambda 替代、事件监听 | ★★★ | 1.5 |
| 14 | 枚举.md | final class extends Enum、values/valueOf、单例 | ★★★ | 1.5 |
学习路线建议
三条学习线索并行推进:面向对象基础(1→6)建立对象思维;封装与访问控制(7→9)构筑代码安全防线;内部类与枚举(10→14)解锁高级组织与状态管理技巧。参数传递(6)和访问修饰符(8)是两条关键分水岭,务必投入足额时间。
角色导览
| 角色 | 身份 | 本章职责 |
|---|---|---|
| 大翔 | 飞翔科技技术总监 / HR 总监 | 代码审查、出面试题、制定权限规范 |
| 白歌 | 飞翔科技系统架构师 | 讲授 OOP 原理、制定封装规范、面试点拨 |
| 小崔 | 飞翔科技初级开发(985 大三) | 踩坑、重构、面试准备 |
| 黄俪 | 飞翔科技前端开发 | 从 JS 转向 Java 时遇到的困惑 |
| 孔蓝 | 飞翔科技测试工程师 | 发现 Bug、分析字节码 |
面试分值分布
根据近 3 年大厂校招面试题统计:
| 知识点 | 出现频率 | 典型题型 |
|---|---|---|
| 值传递机制 | 95% | 判断输出结果、画内存图 |
| static 关键字 | 90% | static 方法能否访问实例变量? |
| 方法重载 | 85% | 重载与重写的区别 |
| 访问修饰符 | 80% | private/default/protected/public 权限矩阵 |
| 匿名内部类 | 80% | 与 Lambda 的关系、变量捕获 |
| 枚举 | 80% | 枚举实现单例、values 方法来源 |
| this 关键字 | 75% | this 在构造器中为什么必须在第一行? |
| 对象内存模型 | 70% | 画 new 对象后的堆栈结构 |
| 静态内部类 | 65% | 与成员内部类的区别、Builder 模式 |
| JavaBean 规范 | 60% | 为什么需要无参构造? |
前置知识
| 知识点 | 掌握程度 | 说明 |
|---|---|---|
| 基本数据类型(8种) | 必须掌握 | 成员变量和参数的类型基础 |
| 运算符与表达式 | 必须掌握 | 方法体中的运算逻辑 |
| 流程控制语句 | 必须掌握 | 方法体中的控制逻辑 |
| 数组 | 必须掌握 | 理解引用类型的内存模型 |
| JVM 内存分区 | 建议了解 | 理解对象在堆/栈中的存储 |
JDK 版本说明
本章内容基于 JDK 8,涵盖以下版本特性:
| JDK 版本 | 引入特性 | 本章涉及 |
|---|---|---|
| JDK 1.0 | class、new、this、static、方法重载、访问修饰符 | 全部涉及 |
| JDK 1.1 | 成员内部类、静态内部类、局部内部类、匿名内部类 | 内部类部分 |
| JDK 5 | 可变参数、静态导入、枚举 | 方法定义、static、枚举 |
| JDK 7 | 钻石操作符 <> | 示例中使用 |
| JDK 8 | Lambda 表达式 | 匿名内部类对比 |
白歌的提醒:这一章是面试送分题的最大出处——值传递、static、访问修饰符、内部类,几乎每轮面试都会问。但这些题也是挂人最多的题,因为"知道"和"理解底层原理"之间隔着一道名为"JVM 内存模型"的鸿沟。请务必手绘每一个内存图。