# 阶段二:面向对象编程(OOP)—— 核心知识点总纲 > 本阶段涵盖:**面向对象基础、构造方法与单例、继承与方法重写、抽象类/final/接口、多态与内部类、匿名内部类与常用 API** > 细分文档:`按日细分/20260720-笔记.md` ~ `按日细分/20260727-笔记.md` > 学生需要重点理解、背诵、掌握的理论核心知识点。 --- ## 一、面向对象基础(对应 07-20) ### 1. 类与对象 - **类** = 模板/图纸(抽象);**对象** = 实体(具体);**1 个类 → 多个对象** - 类包含:成员变量(属性)+ 成员方法(行为,无 static) - 创建对象:`类名 对象名 = new 类名();`;调用成员:`对象名.成员` ### 2. 成员变量 vs 局部变量(四大区别必背) | 维度 | 成员变量 | 局部变量 | |------|---------|---------| | 位置 | 类内方法外 | 方法内(含参数) | | 内存 | **堆** | **栈** | | 生命周期 | 随对象 | 随方法 | | 默认值 | 有默认值 | **必须先赋值** | ### 3. 对象引用共享 多个引用指向同一对象时,修改互相影响(`Teacher t2 = t1;` 后 t2 改 t1 也变)。 ### 4. 封装(必背) - 三大特性:**封装、继承、多态** - **封装两步走**:`private` 属性 + public 的 setter(含校验)/ getter - 访问修饰符:`public`(所有)、`private`(本类)、`default`(同包)、`protected`(同包+子类) - **this 关键字** = 当前对象引用;参数与成员同名时用 `this.成员` 区分(setter 中不能省略) ### 5. 包(Package) - 相当于文件夹;**域名倒写命名**(`com.lovecoding.day01`) - 声明在源文件第一行;包名与目录一致;**同包免 import** ## 二、构造方法与单例模式(对应 07-21) ### 构造方法 10 大要点(必背) 1. 方法名 = 类名(大小写相同) 2. **无返回值类型**(连 void 都不写) 3. 不能 return 返回值 4. **创建对象时自动调用**(不能手动调用) 5. 每个类默认有**隐藏无参构造** 6. **显式定义后默认构造被覆盖** 7. **可重载**(参数列表不同即可) 8. 默认构造权限与类一致 9. **private 构造可阻止外部创建对象**(单例模式铺垫) 10. `this(参数)` 调用本类构造(必须第一行) ### 经典算法 - **Fisher-Yates 洗牌**:从后往前遍历 + 随机交换 - **回文数**:逐位取余反序与原数比较 - **setter 校验**:业务规则在 setter 中校验 ## 三、继承与方法重写(对应 07-22) ### 1. 继承概念 - `class 子类 extends 父类`;关键字 extends = 扩展 - 好处:复用、可维护、建立关系;弊端:**耦合性增强** - 使用前提:**is...a 关系**(学生是人的一种 ✓) ### 2. 方法重写 Override(必背) - 子类与父类**方法签名完全一致**(方法名+参数列表+返回值类型) - `@Override` 注解可选但推荐 - **重写(父子类)vs 重载(同类)**:重载方法名相同参数不同 ### 3. super 关键字(必背) `super.方法()` 调父类被重写方法;`super.属性` 访问父类同名属性;`super()` 调父类构造 ### 4. Java 继承限制(必背) - **单继承**(一个子类只能一个直接父类) - **多层继承**(Son → Dad → Granddad) - **Object 是所有类的根父类** ### 5. 访问修饰符在继承中 `private` 不可继承;`protected` 子类可访问(异包子类 ✅) ### 6. 变量就近原则(必背) **局部 → 本类成员 → 父类成员 → 祖父类成员 → …… → Object**,都没找到编译报错 ### 7. this vs super(必背) - this = 本类引用;super = 父类引用 - 变量/方法/构造三场景对应:`this.成员` vs `super.成员`、`this()` vs `super()` - ⚠️ `this()` 和 `super()` **必须第一行、不能同时出现** ### 8. 继承中构造方法(必背) - 子类构造**默认第一句 super()**(先完成父类对象创建) - **父类没有无参构造** → 子类必须手动 `super(参数)` - `super(参数)` 必须在第一行 ## 四、抽象类、final 与接口(对应 07-23) ### 1. 抽象类(必背) - 无方法体的方法 → 抽象方法;含抽象方法的类 → 抽象类(`abstract` 关键字) - **抽象类不能实例化**;可以有构造方法(供 super 调用) - 子类:①重写所有抽象方法 ②子类也是抽象类 - 抽象类不一定有抽象方法,但抽象方法必须在抽象类中 ### 2. final 关键字(必背) | 修饰 | 作用 | |------|------| | final 类 | **不能被继承**(String、Math、Integer) | | final 方法 | **不能被重写** | | final 变量 | **变成常量**(全大写+下划线命名) | - final 修饰引用:**引用地址不可变,对象内容可改** - ⚠️ final 和 abstract 不能同时使用(语义冲突) ### 3. 模板方法设计模式 父类定义骨架(**模板方法 final 修饰**)+ 子类实现步骤(抽象方法) ### 4. 代码块执行顺序(必背) **静态代码块(类加载一次)→ 构造代码块(每次 new、构造前)→ 构造方法** ### 5. 接口(必背) - 解决**单继承局限**:单继承 + 多实现 - 接口成员:变量默认 `public static final`;方法默认 `public abstract` - 接口**不能实例化、没有构造方法** - 实现:`implements`;可继承父类 + 实现多接口 - **抽象类 vs 接口**:抽象类可有构造/任意成员/单继承;接口无构造/只常量抽象方法/多实现 ### 6. 接口 JDK 版本演进(必背) | 版本 | 新增 | 说明 | |------|------|------| | JDK8 | **默认方法 default** | 有方法体,实现类不强制重写,重写时去掉 default | | JDK8 | **静态方法 static** | 接口名直接调用 | | JDK9 | **私有方法 private** | 抽取默认/静态方法公共代码 | ## 五、多态与内部类(对应 07-24) ### 1. 多态(必背) - **同一个对象在不同时刻表现不同形态** - 前提三条件:①继承或实现 ②方法重写 ③**父类引用指向子类对象** - 成员访问:**编译看左边,运行看右边**(方法);成员变量看父类 - 好处:提高扩展性(开闭原则);USB 接口案例 ### 2. 多态中的转型(必背) - **向上转型**:`Person p = new Student();`(自动) - **向下转型**:`(Student) p`(前提先向上转型);用于调用子类特有方法 - **instanceof**:`对象 instanceof 类型` 返回 boolean,向下转型前安全判断 ### 3. 内部类(了解) - 类中定义类(心脏之于人);内部类可访问外部类所有成员(含 private) - 成员内部类:`外部类.内部类 对象 = new 外部类().new 内部类();` - **设计原则**:内部类私有化 + 外部类公共方法暴露 - 静态内部类、局部内部类(了解) ## 六、匿名内部类与常用 API(对应 07-27) ### 1. 匿名内部类(必背) - **本质**:继承了某个类或实现了某个接口的**子类的匿名对象** - 语法:`new 类/接口() { 重写方法 }` - 三种使用:①多态接收 ②**作方法参数传递(最常用)** ③直接调用(只能一次) - 应用:实现类仅用一次时避免建独立文件、临时逻辑 ### 2. String 字符串(必背) **内存模型:** | 创建方式 | 位置 | 特点 | |----------|------|------| | 直接赋值 | 字符串常量池 | 序列相同则同一对象 | | `new String()` | 堆内存 | 每次 new 新对象 | - **`==` 比较地址、`equals()` 比较内容**(String 已重写) - 常用方法:`equals/equalsIgnoreCase`、`length/charAt`、`substring/indexOf/contains/startsWith/endsWith`、`toUpperCase/toLowerCase/trim/split/replace` - **String 不可变**(final 类);频繁拼接用 `StringBuilder`(单线程,性能高)/ `StringBuffer`(线程安全) ### 3. Math 类(全静态,类名调用) `abs/max/min/pow/sqrt/ceil/floor/round/random/PI` ### 4. 日期时间(JDK8 后推荐) - `LocalDate`/`LocalTime`/`LocalDateTime` + `DateTimeFormatter` - `LocalDate.of(y,m,d)`、`plusDays(5)` 返回新对象、`format(formatter)` ## 本阶段必须背诵的核心口诀 1. **类是模板、对象是实体;一个类可造多个对象** 2. **成员变量在堆、局部变量在栈、局部必须先赋值** 3. **封装两步走**:private 属性 + public setter/getter 4. **this = 当前对象,super = 父类对象;this()/super() 第一行且不同时出现** 5. **重写(父子类签名一致)vs 重载(同类方法名同参数不同)** 6. **单继承、多层继承、一切类根 Object** 7. **变量就近原则**:局部 → 本类 → 父类 → …… → Object 8. **子类构造默认 super();父类无无参构造必须手动 super(参数)** 9. **抽象类不能 new;接口只有常量和抽象方法;单继承 + 多实现** 10. **多态口诀**:编译看左边、运行看右边 11. **匿名内部类 = 继承/实现某类接口的匿名子类对象** 12. **String 用 equals 比较内容;String 不可变、拼接用 StringBuilder**