|
|
@@ -288,7 +288,7 @@ public class Teacher extends Person {
|
|
|
|
|
|
---
|
|
|
|
|
|
-## 三、接口多态与接口新特性(JDK8+)
|
|
|
+## 三、接口多态案例(USB接口 + 笔记本)
|
|
|
|
|
|
### 3.1 接口定义
|
|
|
|
|
|
@@ -300,141 +300,67 @@ public interface Usb {
|
|
|
```
|
|
|
> 📄 来源:`Usb.java`
|
|
|
|
|
|
-### 3.2 接口默认方法(JDK 8)
|
|
|
-
|
|
|
-在接口中定义带方法体的方法,使用 `default` 关键字。实现类可以选择重写或不重写。
|
|
|
+### 3.2 实现 Usb 接口的设备
|
|
|
|
|
|
```java
|
|
|
-public interface Notifiable {
|
|
|
- // 抽象方法——实现类必须重写
|
|
|
- void doSend(String recipient, String message);
|
|
|
-
|
|
|
- // 默认方法——校验参数(实现类可选重写)
|
|
|
- default boolean validateParams(String recipient, String message) {
|
|
|
- if (recipient != null && message != null && !recipient.isEmpty() && !message.isEmpty()) {
|
|
|
- System.out.println("参数校验通过");
|
|
|
- return true;
|
|
|
- }
|
|
|
- System.out.println("参数校验失败:收件人或消息不能为空");
|
|
|
- return false;
|
|
|
+// 鼠标实现 Usb 接口
|
|
|
+public class Mouse implements Usb {
|
|
|
+ @Override
|
|
|
+ public void startUsb() {
|
|
|
+ System.out.println("USB鼠标开启");
|
|
|
}
|
|
|
-
|
|
|
- // 默认方法——记录日志(实现类可选重写)
|
|
|
- default void log(String level, String msg) {
|
|
|
- System.out.println("[" + level + "]消息:" + msg);
|
|
|
+ @Override
|
|
|
+ public void stopUsb() {
|
|
|
+ System.out.println("USB鼠标关闭");
|
|
|
}
|
|
|
}
|
|
|
-```
|
|
|
-> 📄 来源:`Notifiable.java`
|
|
|
-
|
|
|
-### 3.3 接口静态方法(JDK 8)
|
|
|
-
|
|
|
-使用 `static` 关键字定义,通过接口名直接调用。
|
|
|
|
|
|
-```java
|
|
|
-public interface Notifiable {
|
|
|
- static void printNotificationType() {
|
|
|
- System.out.println("通知系统 v1.0——支持邮件/短信/微信通知");
|
|
|
- }
|
|
|
+// Cat 也实现 Usb 接口(演示用:任何类都可以实现接口)
|
|
|
+public class Cat implements Usb {
|
|
|
+ @Override
|
|
|
+ public void startUsb() { }
|
|
|
+ @Override
|
|
|
+ public void stopUsb() { }
|
|
|
}
|
|
|
-
|
|
|
-// 调用方式
|
|
|
-Notifiable.printNotificationType();
|
|
|
```
|
|
|
-> 📄 来源:`Notifiable.java`、`TestNotification.java`
|
|
|
-
|
|
|
----
|
|
|
-
|
|
|
-## 四、模板方法设计模式(基于接口默认方法)
|
|
|
+> 📄 来源:`Mouse.java`、`Cat.java`
|
|
|
|
|
|
-在接口中定义一个 **默认方法** 作为模板,规定固定的算法流程,让实现类只需关注核心业务逻辑。
|
|
|
+### 3.3 笔记本接入设备——多态参数的应用
|
|
|
|
|
|
```java
|
|
|
-public interface Notifiable {
|
|
|
- // 模板方法——定义固定的发送流程
|
|
|
- default void send(String recipient, String message) {
|
|
|
- // 1、校验参数
|
|
|
- boolean boo = validateParams(recipient, message);
|
|
|
- if (boo) {
|
|
|
- // 2、执行发送(调用抽象方法,由实现类完成具体逻辑)
|
|
|
- doSend(recipient, message);
|
|
|
- // 3、记录日志
|
|
|
- log("INFO", "发送成功");
|
|
|
- System.out.println("--- 发送流程结束 ---");
|
|
|
- }
|
|
|
+// 笔记本——方法参数为 Usb 接口类型
|
|
|
+public class NoteBook {
|
|
|
+ public void useUsb(Usb usb) { // 📌 接口类型参数 —— 多态的体现
|
|
|
+ usb.startUsb();
|
|
|
+ System.out.println("开始工作.....");
|
|
|
+ usb.stopUsb();
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
-> 📄 来源:`Notifiable.java`
|
|
|
+> 📄 来源:`NoteBook.java`
|
|
|
|
|
|
-**流程示意图**:
|
|
|
-```
|
|
|
-send() → validateParams() → doSend() → log() → 完成
|
|
|
-(模板) (默认方法-校验) (抽象方法) (默认方法)
|
|
|
-```
|
|
|
-
|
|
|
----
|
|
|
-
|
|
|
-## 五、课后作业:通知系统(Notifiable 体系)
|
|
|
-
|
|
|
-### 5.1 接口定义
|
|
|
-
|
|
|
-使用 JDK8 新特性定义通知接口:
|
|
|
-- 抽象方法 `doSend()`——实现类实现不同的发送逻辑
|
|
|
-- 默认方法 `validateParams()`——参数校验
|
|
|
-- 默认方法 `log()`——日志记录
|
|
|
-- 默认方法 `send()`——**模板方法**,组合流程
|
|
|
-- 静态方法 `printNotificationType()`——输出系统信息
|
|
|
-
|
|
|
-### 5.2 实现类
|
|
|
+### 3.4 测试多态
|
|
|
|
|
|
```java
|
|
|
-public class EmailNotifier implements Notifiable {
|
|
|
- @Override
|
|
|
- public void doSend(String recipient, String message) {
|
|
|
- System.out.println("发送邮件给 " + recipient + ":内容 -" + message);
|
|
|
- }
|
|
|
- // 可选重写默认方法 log()
|
|
|
- @Override
|
|
|
- public void log(String level, String msg) {
|
|
|
- System.out.println("[邮件][" + level + "]消息:" + msg);
|
|
|
- }
|
|
|
-}
|
|
|
-```
|
|
|
-> 📄 来源:`EmailNotifier.java`
|
|
|
+public class Test02 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ NoteBook noteBook = new NoteBook();
|
|
|
|
|
|
-### 5.3 测试类
|
|
|
+ Usb mouse = new Mouse(); // ✅ 接口引用指向实现类对象
|
|
|
+ noteBook.useUsb(mouse); // 传入鼠标
|
|
|
|
|
|
-```java
|
|
|
-public class TestNotification {
|
|
|
- public static void main(String[] args) {
|
|
|
- // 1、调用接口静态方法
|
|
|
- Notifiable.printNotificationType();
|
|
|
- // 2、创建实现类对象
|
|
|
- EmailNotifier en = new EmailNotifier();
|
|
|
- // 3、正常发送
|
|
|
- en.send("admin@163.com", "系统升级通知");
|
|
|
- // 4、参数为空——触发校验失败
|
|
|
- en.send("", "测试");
|
|
|
+ Usb cat = new Cat(); // ✅ 猫也实现了 Usb
|
|
|
+ noteBook.useUsb(cat); // 传入猫 USB
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
-> 📄 来源:`TestNotification.java`
|
|
|
-
|
|
|
-### 5.4 作业题目文档
|
|
|
-
|
|
|
-课后作业的完整题目要求、预期输出及思考题已整理为独立文档:
|
|
|
-
|
|
|
-📄 **`homework/题目.md`** → [查看作业题目](../../授课代码/c260724/src/homework/题目.md)
|
|
|
+> 📄 来源:`Test02.java`
|
|
|
|
|
|
-该文档包含:
|
|
|
-- 完整的接口设计与实现类要求(含 `SMSNotifier` 短信通知实现)
|
|
|
-- 详细的预期输出对照
|
|
|
-- 3 道思考题(final 与接口方法的限制、默认方法重写的意义、静态方法调用方式)
|
|
|
+> **关键点**:`NoteBook.useUsb(Usb usb)` 的参数类型是 **接口**,任何实现 `Usb` 接口的类都可以传入,无需修改笔记本的代码即可接入新设备——这就是 **多态提高扩展性** 的典型应用。
|
|
|
|
|
|
---
|
|
|
|
|
|
-## 六、随堂练习要点
|
|
|
+## 四、随堂练习要点
|
|
|
|
|
|
| 练习方向 | 涉及知识点 | 对应文件 |
|
|
|
|---------|-----------|---------|
|
|
|
@@ -442,24 +368,20 @@ public class TestNotification {
|
|
|
| 多态中的转型 | 向上转型、向下转型、instanceof 运算符 | `Demo02.java`、`Test03.java` |
|
|
|
| 抽象类多态综合 | 抽象父类 Person、多态参数、向下转型调特有方法 | `Test03.java`、`Person.java` |
|
|
|
| 接口多态 | Usb 接口、笔记本接入多设备 | `Test02.java`、`NoteBook.java` |
|
|
|
-| 通知系统(作业) | 接口默认方法、静态方法、模板方法设计模式 | 作业包 `homework` + [`题目.md`](../../授课代码/c260724/src/homework/题目.md) |
|
|
|
|
|
|
---
|
|
|
|
|
|
-## 七、拓展阅读 & 常见面试题
|
|
|
+## 五、拓展阅读 & 常见面试题
|
|
|
|
|
|
1. **多态的实现原理**——Java 中多态是通过**动态绑定(后期绑定)**实现的,JVM 在运行时根据对象的实际类型调用对应的方法。
|
|
|
2. **多态与继承的关系**——多态是基于继承或接口实现的。
|
|
|
3. **多态的优势**——提高代码的可扩展性和可维护性,符合**开闭原则**(对扩展开放,对修改关闭)。
|
|
|
4. **向下转型的风险**——向下转型必须配合 `instanceof` 判断,否则可能抛出 `ClassCastException`(类型转换异常)。
|
|
|
5. **instanceof 的用法**——常用于向下转型前的安全判断,避免强制类型转换异常。
|
|
|
-6. **接口默认方法的用途**——在不破坏已有实现类的前提下向接口添加新方法;实现模板方法模式。
|
|
|
-7. **接口静态方法的用途**——提供工具方法,接口即命名空间,无需额外工具类。
|
|
|
-8. **模板方法设计模式**——定义一个操作中的算法骨架(模板方法),将一些步骤延迟到子类/实现类中实现。
|
|
|
|
|
|
---
|
|
|
|
|
|
-## 八、今日知识图谱
|
|
|
+## 六、今日知识图谱
|
|
|
|
|
|
```
|
|
|
面向对象三大特征
|
|
|
@@ -477,9 +399,6 @@ public class TestNotification {
|
|
|
│ │ └── 用途:调用子类特有方法
|
|
|
│ └── instanceof 运算符
|
|
|
│ └── 格式:对象名 instanceof 类型(返回 boolean)
|
|
|
- ├── 多态的好处:提高扩展性(开闭原则)
|
|
|
- │ └── 案例:NoteBook.useUsb(Usb usb)
|
|
|
- └── 接口多态 + JDK8 新特性
|
|
|
- ├── 默认方法(default)—— 模板方法设计模式
|
|
|
- └── 静态方法(static)—— 接口名直接调用
|
|
|
+ └── 多态的好处:提高扩展性(开闭原则)
|
|
|
+ └── 案例:NoteBook.useUsb(Usb usb)
|
|
|
```
|