|
@@ -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:抽象类能不能被实例化?**
|
|
**Q1:抽象类能不能被实例化?**
|
|
|
> 不能。抽象类不能直接 `new` 创建对象。
|
|
> 不能。抽象类不能直接 `new` 创建对象。
|
|
@@ -632,10 +742,17 @@ public class Test03 {
|
|
|
**Q9:模板方法模式中,模板方法为什么用 `final` 修饰?**
|
|
**Q9:模板方法模式中,模板方法为什么用 `final` 修饰?**
|
|
|
> 为了防止子类篡改算法的执行流程。如果模板方法不被 `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/IandI/abstract.html)
|
|
|
|
|
+- [Java 代码块初始化(Oracle 官方文档)](https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html)
|
|
|
- 抽象类 vs 接口(Interface)的区别(将在后续课程中讲解)
|
|
- 抽象类 vs 接口(Interface)的区别(将在后续课程中讲解)
|
|
|
- 模板方法设计模式(Template Method Pattern)—— 抽象类的经典应用场景
|
|
- 模板方法设计模式(Template Method Pattern)—— 抽象类的经典应用场景
|