Просмотр исходного кода

docs: 更新20260723课堂笔记,同步代码变更——新增代码块(局部代码块/构造代码块/静态代码块的定义、执行顺序和执行时机)

WanJL 2 дней назад
Родитель
Сommit
5e53d7f61e

+ 2 - 2
README.md

@@ -30,7 +30,7 @@
 | 2026-07-20 | [面向对象基础:类与对象、成员变量与成员方法、创建对象与使用成员](./课堂笔记/01-JavaSE基础-笔记/20260720-笔记.md) |
 | 2026-07-21 | [构造方法(构造器):构造方法引出、格式与特点、默认构造方法、无参构造方法、构造方法重载、有参构造方法调用、this 在构造方法中的应用、private 构造方法阻止外部创建对象、完整 Person 示例(4种构造方法重载)、课后作业回顾(Fisher-Yates 洗牌算法/Emp 员工封装/MathTools 回文数/Student 封装展示)](./课堂笔记/01-JavaSE基础-笔记/20260721-笔记.md) |
 | 2026-07-22 | [继承:继承的概念、格式、好处与弊端、is...a 使用场景、方法重写(@Override)、super 关键字调用父类成员、同名属性处理(this vs super)、变量的就近原则查找、this vs super 完整对比、继承中构造方法特点(子类默认调用 super()、父类无无参构造时的处理)、单继承与多层继承、Object 根类、访问修饰符在继承中的体现、随堂练习(学生成绩管理系统-构造方法版)、课后作业(猜数游戏面向对象版/BookManager图书管理系统)](./课堂笔记/01-JavaSE基础-笔记/20260722-笔记.md) |
-| 2026-07-23 | [抽象类(abstract)+ final 关键字 + 模板方法设计模式:抽象类引出与概念、抽象类定义(abstract 关键字)、抽象类特点(不能实例化/可有构造方法/子类必须重写所有抽象方法或自身抽象)、抽象类代码示例(Animal→Cat/Dog 动物体系、Emp→javaEmp 员工体系、BaseService→UserService 服务层体系);final 修饰类(禁止继承)/修饰方法(禁止重写)/修饰变量(变成常量、常量全大写命名规范)、final 引用类型(引用地址不可变但对象内容可修改)、final vs abstract 对比;模板方法设计模式(Template Method Pattern):模板类组成(final 模板方法 + abstract 定制方法)、MyOneDayTemplate 示例(ZhSanOneDay / LiSiOneDay)、模板方法 vs 普通继承+重写对比;随堂练习(Shape 抽象类计算周长+面积)](./课堂笔记/01-JavaSE基础-笔记/20260723-笔记.md) |
+| 2026-07-23 | [抽象类(abstract)+ final 关键字 + 模板方法设计模式 + 代码块:抽象类引出与概念、抽象类定义(abstract 关键字)、抽象类特点(不能实例化/可有构造方法/子类必须重写所有抽象方法或自身抽象)、抽象类代码示例(Animal→Cat/Dog 动物体系、Emp→javaEmp 员工体系、BaseService→UserService 服务层体系);final 修饰类(禁止继承)/修饰方法(禁止重写)/修饰变量(变成常量、常量全大写命名规范)、final 引用类型(引用地址不可变但对象内容可修改)、final vs abstract 对比;模板方法设计模式(Template Method Pattern):模板类组成(final 模板方法 + abstract 定制方法)、MyOneDayTemplate 示例(ZhSanOneDay / LiSiOneDay)、模板方法 vs 普通继承+重写对比;代码块(局部代码块/构造代码块/静态代码块的定义、执行时机、执行顺序验证、构造代码块提取公共代码);随堂练习(Shape 抽象类计算周长+面积)](./课堂笔记/01-JavaSE基础-笔记/20260723-笔记.md) |
 
 ## 二、授课代码
 
@@ -47,7 +47,7 @@
 | 2026-07-20 | 面向对象基础:类与对象、成员变量与成员方法、创建对象与使用成员、对象地址输出、成员变量 vs 局部变量、对象引用与内存共享、对象数组、循环创建对象并存入数组、多个类协同建模(古诗场景/交通场景)、封装(private/setter/getter/this关键字/权限修饰符)、包(Package)声明与同包访问、方法返回对象数组、综合应用(学生管理+随机抽取) | `c260720` | [`p1`](./授课代码/c260720/src/p1/) / [`p2`](./授课代码/c260720/src/p2/) |
 | 2026-07-21 | 构造方法(构造器):构造方法概念与格式、默认构造方法、构造方法重载、有参构造方法、private 构造方法、this 关键字在构造方法中的应用、随堂练习(Cat/Dog/Book/Phone/单例Manager)、Fisher-Yates 洗牌算法(数组随机打乱)、封装与 setter 校验复习、回文数判断算法 | `c260721` | [`course`](./授课代码/c260721/src/course/) / [`homework/c260717`](./授课代码/c260721/src/homework/c260717/) / [`homework/c260720`](./授课代码/c260721/src/homework/c260720/) / [`exercise/exercise01`](./授课代码/c260721/src/exercise/exercise01/) / [`exercise/exercise02`](./授课代码/c260721/src/exercise/exercise02/) |
 | 2026-07-22 | 继承(extends)的概念、格式、好处与弊端、is...a 使用场景、方法重写(Override)、super 关键字、同名属性处理、变量的就近原则查找、this vs super 对比、继承中构造方法特点(子类默认调用 super()、父类无无参构造时的处理)、单继承与多层继承(Animal→Bird→Penguin / Granddad→Dad→Son)、访问修饰符在继承中的体现、随堂练习(学生成绩管理系统-构造方法版/对象数组/冒泡排序)、课后作业(GuessGame 猜数游戏面向对象版/BookManager 图书管理系统) | `c260722` | [`course`](./授课代码/c260722/src/course/) / [`exercise/studentSystem`](./授课代码/c260722/src/exercise/studentSystem/) / [`homework/p08_guessgame`](./授课代码/c260722/src/homework/p08_guessgame/) / [`homework/p09_bookmanager`](./授课代码/c260722/src/homework/p09_bookmanager/) |
-| 2026-07-23 | 抽象类(abstract):抽象类概念与引出、抽象类定义(abstract 关键字)、抽象类特点(不能实例化/可有构造方法/子类必须重写所有抽象方法或自身抽象)、抽象类代码示例(Animal→Cat/Dog 动物体系、Emp→javaEmp 员工体系、BaseService→UserService 服务层体系)、Test01 测试类验证多态行为;final 关键字(final 类/方法/变量/引用类型、常量全大写规范、Test02 测试 final 行为);模板方法设计模式——MyOneDayTemplate(final 模板方法 myOneDay + 抽象方法 eat/sleep/play,ZhSanOneDay / LiSiOneDay 子类实现,Test03 测试) | `c260723` | [`course`](./授课代码/c260723/src/course/) |
+| 2026-07-23 | 抽象类(abstract):抽象类概念与引出、抽象类定义、抽象类特点、抽象类代码示例(Animal→Cat/Dog / Emp→javaEmp / BaseService→UserService)、Test01 测试类;final 关键字(final 类/方法/变量/引用类型、常量全大写规范、Test02 测试 final 行为);模板方法设计模式——MyOneDayTemplate(final 模板方法 myOneDay + 抽象方法 eat/sleep/play,ZhSanOneDay / LiSiOneDay 子类实现,Test03 测试);代码块——Demo04.java(局部代码块/构造代码块/静态代码块的定义、执行顺序) | `c260723` | [`course`](./授课代码/c260723/src/course/) |
 
 ## 三、课堂练习题
 

+ 50 - 0
授课代码/c260723/src/course/Demo04.java

@@ -0,0 +1,50 @@
+package course;
+
+
+/**
+ * @author WanJl
+ * @version 1.0
+ * @title Demo04
+ * @description 代码块
+ * @create 2026/7/23
+ */
+public class Demo04 {
+    /*
+        在Java中使用 {}括起来的代码称为代码块
+        代码块的格式:
+        {
+            代码....
+        }
+
+
+        Java中分为几种代码块:
+            1、局部代码块 -- 就是在方法里面加代码块
+            2、构造代码块 -- 就是在方法外面类里面加代码块
+            3、静态代码块 -- 就是使用static修饰的代码块
+
+
+
+     */
+
+    public Demo04() {
+        {
+            System.out.println("我是局部代码块,我存在于方法或构造方法里面");
+        }
+        System.out.println("我是构造方法");
+    }
+
+    {
+        //构造代码块,其实就是把里面的代码 在运行的时候,整合到 被调用的构造方法中
+        System.out.println("我是构造代码块....我是在构造方法前面执行....");
+    }
+
+    static {
+        System.out.println("我是静态代码块....我最先执行");
+    }
+
+
+    public static void main(String[] args) {
+        Demo04 d;
+
+    }
+}

+ 120 - 3
课堂笔记/01-JavaSE基础-笔记/20260723-笔记.md

@@ -593,7 +593,117 @@ public class Test03 {
 
 ---
 
-## 六、随堂练习要点
+## 六、代码块(Code Block)
+
+### 1. 代码块的概念
+
+**文件**:`Demo04.java`
+
+在 Java 中,使用 `{}` 括起来的代码称为 **代码块**。
+
+```java
+{
+    // 代码....
+}
+```
+
+Java 中分为三种代码块:
+
+| 代码块类型 | 位置 | 执行时机 |
+|-----------|------|---------|
+| **局部代码块** | 方法或构造方法内部 | 调用到该方法时执行 |
+| **构造代码块** | 方法外部、类内部 | 每次创建对象时执行(在构造方法之前) |
+| **静态代码块** | 类内部,使用 `static` 修饰 | 类加载时执行(仅一次) |
+
+### 2. 三种代码块示例
+
+**文件**:`Demo04.java`
+
+```java
+package course;
+
+public class Demo04 {
+
+    public Demo04() {
+        // 局部代码块——存在于方法或构造方法里面
+        {
+            System.out.println("我是局部代码块,我存在于方法或构造方法里面");
+        }
+        System.out.println("我是构造方法");
+    }
+
+    // 构造代码块——在方法外面类里面
+    {
+        System.out.println("我是构造代码块....我是在构造方法前面执行....");
+    }
+
+    // 静态代码块——使用 static 修饰
+    static {
+        System.out.println("我是静态代码块....我最先执行");
+    }
+
+    public static void main(String[] args) {
+        Demo04 d = new Demo04();
+    }
+}
+```
+
+### 3. 执行顺序验证
+
+执行 `main` 方法中的 `new Demo04()`,输出结果:
+
+```
+我是静态代码块....我最先执行
+我是构造代码块....我是在构造方法前面执行....
+我是局部代码块,我存在于方法或构造方法里面
+我是构造方法
+```
+
+**执行流程说明**:
+
+| 步骤 | 执行的代码 | 说明 |
+|------|----------|------|
+| ① | `static { ... }` | 类加载时执行静态代码块(仅执行一次) |
+| ② | `{ ... }`(构造代码块) | 每次创建对象时,在构造方法之前执行 |
+| ③ | `{ ... }`(局部代码块) | 构造方法内部按顺序执行到局部代码块 |
+| ④ | `构造方法体` | 构造方法的其他代码最后执行 |
+
+> **注意**:如果 `main` 方法中只声明变量 `Demo04 d;` 而不创建对象,则只有静态代码块执行,构造代码块和构造方法都不会执行。
+
+### 4. 三种代码块的特点总结
+
+| 代码块类型 | 执行次数 | 执行时机 | 典型用途 |
+|-----------|---------|---------|---------|
+| **静态代码块** | 1 次(类加载时) | 最早执行 | 加载配置文件、初始化静态资源 |
+| **构造代码块** | 每次创建对象 | 在构造方法之前 | 提取多个构造方法的共同代码 |
+| **局部代码块** | 调用到该位置时 | 方法执行过程中 | 限制局部变量的作用域 |
+
+### 5. 构造代码块的作用
+
+构造代码块的一个重要特性:**把里面的代码在运行的时候,整合到被调用的构造方法中**。这意味着:
+
+- 如果一个类有多个重载的构造方法,每个构造方法中都需要执行的相同代码,可以提取到构造代码块中
+- 构造代码块在 **所有构造方法之前** 执行
+- 避免多个构造方法中的代码重复
+
+```java
+public class Example {
+    // 构造代码块——所有构造方法都会执行
+    {
+        System.out.println("初始化公共资源...");
+    }
+
+    public Example() {
+        System.out.println("无参构造");
+    }
+
+    public Example(String name) {
+        System.out.println("有参构造:" + name);
+    }
+}
+```
+
+## 七、随堂练习要点
 
 **练习目标**:理解抽象类的定义和使用
 
@@ -603,7 +713,7 @@ public class Test03 {
 
 ---
 
-## 、面试常见问题
+## 、面试常见问题
 
 **Q1:抽象类能不能被实例化?**
 > 不能。抽象类不能直接 `new` 创建对象。
@@ -632,10 +742,17 @@ public class Test03 {
 **Q9:模板方法模式中,模板方法为什么用 `final` 修饰?**
 > 为了防止子类篡改算法的执行流程。如果模板方法不被 `final` 修饰,子类可以重写它,破坏父类定义好的步骤结构,失去了「模板」的意义。
 
+**Q10:Java 中的代码块有哪几种?它们的执行顺序是什么?**
+> 有三种:① 静态代码块(`static {}`)② 构造代码块(`{}`)③ 局部代码块(方法内的 `{}`)。执行顺序:静态代码块(类加载时执行一次)→ 构造代码块(每次创建对象时执行,在构造方法之前)→ 构造方法(含内部的局部代码块)。
+
+**Q11:构造代码块有什么作用?**
+> 构造代码块可以把多个构造方法中共同的代码提取出来,避免重复。每次创建对象时,构造代码块会在构造方法之前自动执行,无论调用的是哪个重载的构造方法。
+
 ---
 
-## 八、拓展阅读
+## 、拓展阅读
 
 - [Java 抽象类(Oracle 官方文档)](https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html)
+- [Java 代码块初始化(Oracle 官方文档)](https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html)
 - 抽象类 vs 接口(Interface)的区别(将在后续课程中讲解)
 - 模板方法设计模式(Template Method Pattern)—— 抽象类的经典应用场景