Browse Source

分层练习设计

main
ZhangYuhan 2 weeks ago
parent
commit
b5bedb667f
  1. 9
      2-W5/w5基础版/Circle.java
  2. 9
      2-W5/w5基础版/Rectangle.java
  3. 9
      2-W5/w5基础版/Shape.java
  4. 24
      2-W5/w5基础版/TestShape.java
  5. BIN
      2-W5/w5基础版/基础版运行结果.png
  6. 20
      2-W5/w5挑战版/Person.java
  7. 42
      2-W5/w5挑战版/PersonManager.java
  8. 22
      2-W5/w5挑战版/Student.java
  9. 22
      2-W5/w5挑战版/Teacher.java
  10. 20
      2-W5/w5挑战版/TestPersonSystem.java
  11. BIN
      2-W5/w5挑战版/挑战版运行结果.png
  12. 8
      2-W5/w5挑战版/添加属性问题回答
  13. 18
      2-W5/w5进阶版/Computer.java
  14. 14
      2-W5/w5进阶版/Keyboard.java
  15. 14
      2-W5/w5进阶版/Mouse.java
  16. 17
      2-W5/w5进阶版/TestUSB.java
  17. 7
      2-W5/w5进阶版/USB.java
  18. BIN
      2-W5/w5进阶版/进阶版运行结果.png

9
2-W5/w5基础版/Circle.java

@ -0,0 +1,9 @@
package w5基础版;
// 圆
public class Circle extends Shape {
@Override
public void draw() {
System.out.println("🔵 绘制圆形");
}
}

9
2-W5/w5基础版/Rectangle.java

@ -0,0 +1,9 @@
package w5基础版;
// 矩形
public class Rectangle extends Shape {
@Override
public void draw() {
System.out.println("🔲 绘制矩形");
}
}

9
2-W5/w5基础版/Shape.java

@ -0,0 +1,9 @@
package w5基础版;
// 父类
public class Shape {
// draw方法
public void draw() {
System.out.println("绘制图形");
}
}

24
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();
}
}

BIN
2-W5/w5基础版/基础版运行结果.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

20
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);
}
}

42
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<Person> 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() + " 是普通人员");
}
}
}
}

22
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;
}
}

22
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;
}
}

20
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();
}
}

BIN
2-W5/w5挑战版/挑战版运行结果.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

8
2-W5/w5挑战版/添加属性问题回答

@ -0,0 +1,8 @@
核心思路:利用多态,将 addStudent 和 addTeacher 合并为 addPerson(Person p),用父类引用统一接收所有子类对象,存入 List<Person> 统一管理,实现代码复用和统一入口。
2. 特有属性的处理方案:
◦ 方案一(作业首选):instanceof 类型判断 + 向下转型。在需要访问子类特有属性时,通过 instanceof 判断对象的真实类型,将父类引用向下转型为对应的子类类型,再调用子类特有的 getter 方法(如 getStudentId()/getTeacherId()),从而获取特有属性。
◦ 方案二(进阶):模板方法模式。在父类 Person 中定义抽象方法 getSpecialInfo(),让 Student和 Teacher 各自实现该方法,返回自己的特有属性,父类统一调用该方法,无需类型判断,代码更简洁,符合开闭原则。
3. 优势:
◦ 合并方法后,减少了代码冗余,统一了人员添加的入口,提升了代码的可维护性。
◦ 多态保证了新增人员类型(如「管理员」)时,无需修改 addPerson 方法,仅需新增子类即可,符合面向对象的设计思想。
4. 注意事项:向下转型时,必须先通过 instanceof 判断类型,避免 ClassCastException 类型转换异常;子类特有属性必须通过 getter 方法访问,保证封装性。

18
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");
}
}

14
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("⌨️ 键盘已关闭并断开");
}
}

14
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("🖱️ 鼠标已关闭并断开");
}
}

17
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);
}
}

7
2-W5/w5进阶版/USB.java

@ -0,0 +1,7 @@
package w5进阶版;
// USB接口
public interface USB {
void open(); // 打开设备
void close(); // 关闭设备
}

BIN
2-W5/w5进阶版/进阶版运行结果.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Loading…
Cancel
Save