diff --git a/2-W5/w5基础版/Circle.java b/2-W5/w5基础版/Circle.java new file mode 100644 index 0000000..9b31b17 --- /dev/null +++ b/2-W5/w5基础版/Circle.java @@ -0,0 +1,9 @@ +package w5基础版; + +// 圆 +public class Circle extends Shape { + @Override + public void draw() { + System.out.println("🔵 绘制圆形"); + } +} \ No newline at end of file diff --git a/2-W5/w5基础版/Rectangle.java b/2-W5/w5基础版/Rectangle.java new file mode 100644 index 0000000..d89640c --- /dev/null +++ b/2-W5/w5基础版/Rectangle.java @@ -0,0 +1,9 @@ +package w5基础版; + +// 矩形 +public class Rectangle extends Shape { + @Override + public void draw() { + System.out.println("🔲 绘制矩形"); + } +} \ No newline at end of file diff --git a/2-W5/w5基础版/Shape.java b/2-W5/w5基础版/Shape.java new file mode 100644 index 0000000..d9c6a07 --- /dev/null +++ b/2-W5/w5基础版/Shape.java @@ -0,0 +1,9 @@ +package w5基础版; + +// 父类 +public class Shape { + // draw方法 + public void draw() { + System.out.println("绘制图形"); + } +} \ No newline at end of file diff --git a/2-W5/w5基础版/TestShape.java b/2-W5/w5基础版/TestShape.java new file mode 100644 index 0000000..c944162 --- /dev/null +++ b/2-W5/w5基础版/TestShape.java @@ -0,0 +1,24 @@ +package w5基础版; + +// 测试类 +public class TestShape { + public static void main(String[] args) { + // 1. 创建对象 + Shape circle = new Circle(); + Shape rectangle = new Rectangle(); + + // 2. 调用统一绘制方法 + drawShape(circle); + drawShape(rectangle); + + // 3. 直接调用 + System.out.println("\n=== 直接调用 ==="); + circle.draw(); + rectangle.draw(); + } + + // 核心方法:接收父类引用,实现多态调用 + public static void drawShape(Shape s) { + s.draw(); + } +} \ No newline at end of file diff --git a/2-W5/w5基础版/基础版运行结果.png b/2-W5/w5基础版/基础版运行结果.png new file mode 100644 index 0000000..88c3f67 Binary files /dev/null and b/2-W5/w5基础版/基础版运行结果.png differ diff --git a/2-W5/w5挑战版/Person.java b/2-W5/w5挑战版/Person.java new file mode 100644 index 0000000..87a05b1 --- /dev/null +++ b/2-W5/w5挑战版/Person.java @@ -0,0 +1,20 @@ +package w5挑战版; +// 人类(父类) +public class Person { + private String name; + private int age; + + public Person(String name, int age) { + this.name = name; + this.age = age; + } + + // Getter + public String getName() { return name; } + public int getAge() { return age; } + + // 通用方法 + public void showInfo() { + System.out.println("姓名:" + name + ",年龄:" + age); + } +} \ No newline at end of file diff --git a/2-W5/w5挑战版/PersonManager.java b/2-W5/w5挑战版/PersonManager.java new file mode 100644 index 0000000..93cf30a --- /dev/null +++ b/2-W5/w5挑战版/PersonManager.java @@ -0,0 +1,42 @@ +package w5挑战版; + +import java.util.List; +import java.util.ArrayList; + +// 人员管理器(重构关键) +public class PersonManager { + // 用List存储Person,容纳所有子类对象 + private List personList = new ArrayList<>(); + + // 核心重构:合并成一个方法,接收父类引用 + public void addPerson(Person person) { + personList.add(person); + System.out.println("添加成功:" + person.getClass().getSimpleName()); + } + + // 显示所有人信息(多态调用) + public void showAllPersons() { + System.out.println("\n=== 所有人员列表 ==="); + for (Person p : personList) { + p.showInfo(); + } + } + + // 解决特定属性问题:使用instanceof判断类型并获取属性 + public void checkPersonDetails() { + System.out.println("\n=== 人员详情检查 ==="); + for (Person p : personList) { + if (p instanceof Student) { + Student s = (Student) p; + // 现在Student有了getStudentId(),就不会报错了 + System.out.println(s.getName() + " 是学生,学号:" + s.getStudentId()); + } else if (p instanceof Teacher) { + Teacher t = (Teacher) p; + // 现在Teacher有了getTeacherId(),就不会报错了 + System.out.println(t.getName() + " 是老师,工号:" + t.getTeacherId()); + } else { + System.out.println(p.getName() + " 是普通人员"); + } + } + } +} \ No newline at end of file diff --git a/2-W5/w5挑战版/Student.java b/2-W5/w5挑战版/Student.java new file mode 100644 index 0000000..a4b4f27 --- /dev/null +++ b/2-W5/w5挑战版/Student.java @@ -0,0 +1,22 @@ +package w5挑战版; + +// 学生 +public class Student extends Person { + private String studentId; // 学号 + + public Student(String name, int age, String studentId) { + super(name, age); + this.studentId = studentId; + } + + // 重写显示信息 + @Override + public void showInfo() { + System.out.printf("【学生】%s | 年龄:%d | 学号:%s%n", getName(), getAge(), studentId); + } + + // 🔥 必须加这个getter!否则PersonManager里调用不到 + public String getStudentId() { + return studentId; + } +} \ No newline at end of file diff --git a/2-W5/w5挑战版/Teacher.java b/2-W5/w5挑战版/Teacher.java new file mode 100644 index 0000000..8631d15 --- /dev/null +++ b/2-W5/w5挑战版/Teacher.java @@ -0,0 +1,22 @@ +package w5挑战版; + +// 老师 +public class Teacher extends Person { + private String teacherId; // 工号 + + public Teacher(String name, int age, String teacherId) { + super(name, age); + this.teacherId = teacherId; + } + + // 重写显示信息 + @Override + public void showInfo() { + System.out.printf("【老师】%s | 年龄:%d | 工号:%s%n", getName(), getAge(), teacherId); + } + + // 🔥 必须加这个getter!否则PersonManager里调用不到 + public String getTeacherId() { + return teacherId; + } +} \ No newline at end of file diff --git a/2-W5/w5挑战版/TestPersonSystem.java b/2-W5/w5挑战版/TestPersonSystem.java new file mode 100644 index 0000000..389f181 --- /dev/null +++ b/2-W5/w5挑战版/TestPersonSystem.java @@ -0,0 +1,20 @@ +package w5挑战版; + + +// 测试重构后的系统 +public class TestPersonSystem { + public static void main(String[] args) { + PersonManager manager = new PersonManager(); + + // 统一添加(无需区分学生/老师,全部是Person) + manager.addPerson(new Student("张三", 18, "2025001")); + manager.addPerson(new Teacher("李老师", 40, "T001")); + manager.addPerson(new Student("李四", 19, "2025002")); + + // 显示所有人 + manager.showAllPersons(); + + // 检查特定属性 + manager.checkPersonDetails(); + } +} \ No newline at end of file diff --git a/2-W5/w5挑战版/挑战版运行结果.png b/2-W5/w5挑战版/挑战版运行结果.png new file mode 100644 index 0000000..8d882d5 Binary files /dev/null and b/2-W5/w5挑战版/挑战版运行结果.png differ diff --git a/2-W5/w5挑战版/添加属性问题回答 b/2-W5/w5挑战版/添加属性问题回答 new file mode 100644 index 0000000..574f707 --- /dev/null +++ b/2-W5/w5挑战版/添加属性问题回答 @@ -0,0 +1,8 @@ +核心思路:利用多态,将 addStudent 和 addTeacher 合并为 addPerson(Person p),用父类引用统一接收所有子类对象,存入 List 统一管理,实现代码复用和统一入口。 +2. 特有属性的处理方案: +◦ 方案一(作业首选):instanceof 类型判断 + 向下转型。在需要访问子类特有属性时,通过 instanceof 判断对象的真实类型,将父类引用向下转型为对应的子类类型,再调用子类特有的 getter 方法(如 getStudentId()/getTeacherId()),从而获取特有属性。 +◦ 方案二(进阶):模板方法模式。在父类 Person 中定义抽象方法 getSpecialInfo(),让 Student和 Teacher 各自实现该方法,返回自己的特有属性,父类统一调用该方法,无需类型判断,代码更简洁,符合开闭原则。 +3. 优势: +◦ 合并方法后,减少了代码冗余,统一了人员添加的入口,提升了代码的可维护性。 +◦ 多态保证了新增人员类型(如「管理员」)时,无需修改 addPerson 方法,仅需新增子类即可,符合面向对象的设计思想。 +4. 注意事项:向下转型时,必须先通过 instanceof 判断类型,避免 ClassCastException 类型转换异常;子类特有属性必须通过 getter 方法访问,保证封装性。 diff --git a/2-W5/w5进阶版/Computer.java b/2-W5/w5进阶版/Computer.java new file mode 100644 index 0000000..2d634c8 --- /dev/null +++ b/2-W5/w5进阶版/Computer.java @@ -0,0 +1,18 @@ +package w5进阶版; + +// 电脑 +public class Computer { + // 使用USB设备的方法(多态参数) + public void useUSB(USB usb) { + System.out.println("\n电脑开始使用USB设备..."); + usb.open(); + // 模拟工作 + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + usb.close(); + System.out.println("USB设备使用完毕\n"); + } +} \ No newline at end of file diff --git a/2-W5/w5进阶版/Keyboard.java b/2-W5/w5进阶版/Keyboard.java new file mode 100644 index 0000000..6de9b57 --- /dev/null +++ b/2-W5/w5进阶版/Keyboard.java @@ -0,0 +1,14 @@ +package w5进阶版; + +// 键盘 +public class Keyboard implements USB { + @Override + public void open() { + System.out.println("⌨️ 键盘已连接并打开"); + } + + @Override + public void close() { + System.out.println("⌨️ 键盘已关闭并断开"); + } +} \ No newline at end of file diff --git a/2-W5/w5进阶版/Mouse.java b/2-W5/w5进阶版/Mouse.java new file mode 100644 index 0000000..5981493 --- /dev/null +++ b/2-W5/w5进阶版/Mouse.java @@ -0,0 +1,14 @@ +package w5进阶版; + +// 鼠标 +public class Mouse implements USB { + @Override + public void open() { + System.out.println("🖱️ 鼠标已连接并打开"); + } + + @Override + public void close() { + System.out.println("🖱️ 鼠标已关闭并断开"); + } +} \ No newline at end of file diff --git a/2-W5/w5进阶版/TestUSB.java b/2-W5/w5进阶版/TestUSB.java new file mode 100644 index 0000000..7874aa8 --- /dev/null +++ b/2-W5/w5进阶版/TestUSB.java @@ -0,0 +1,17 @@ +package w5进阶版; + +// 测试 +public class TestUSB { + public static void main(String[] args) { + // 创建电脑对象 + Computer myComputer = new Computer(); + + // 创建USB设备 + USB mouse = new Mouse(); + USB keyboard = new Keyboard(); + + // 插入不同设备 + myComputer.useUSB(mouse); + myComputer.useUSB(keyboard); + } +} \ No newline at end of file diff --git a/2-W5/w5进阶版/USB.java b/2-W5/w5进阶版/USB.java new file mode 100644 index 0000000..d48daed --- /dev/null +++ b/2-W5/w5进阶版/USB.java @@ -0,0 +1,7 @@ +package w5进阶版; + +// USB接口 +public interface USB { + void open(); // 打开设备 + void close(); // 关闭设备 +} \ No newline at end of file diff --git a/2-W5/w5进阶版/进阶版运行结果.png b/2-W5/w5进阶版/进阶版运行结果.png new file mode 100644 index 0000000..9dbb806 Binary files /dev/null and b/2-W5/w5进阶版/进阶版运行结果.png differ