diff --git a/w6/Animal.java b/w6/Animal.java new file mode 100644 index 0000000..24c530c --- /dev/null +++ b/w6/Animal.java @@ -0,0 +1,9 @@ +/** + * 动物抽象父类,定义所有动物的通用行为 + */ +public abstract class Animal { + /** + * 抽象方法:动物发出叫声,由子类具体实现 + */ + public abstract void makeSound(); +} \ No newline at end of file diff --git a/w6/AnimalTest.java b/w6/AnimalTest.java new file mode 100644 index 0000000..be96c20 --- /dev/null +++ b/w6/AnimalTest.java @@ -0,0 +1,31 @@ +/** + * 主测试类,验证多态调用 + */ + public class AnimalTest { + public static void main(String[] args) { + // 1. 多态:父类引用指向子类对象 + Animal dog = new Dog(); + Animal cat = new Cat(); + // 2. 调用makeSound方法,体现多态 + System.out.println("=== 动物叫声测试 ==="); + dog.makeSound(); + cat.makeSound(); + // 3. 测试游泳接口:Dog实现了Swimmable,Cat未实现 + System.out.println("\n=== 游泳能力测试 ==="); + if (dog instanceof Swimmable) { + ((Swimmable) dog).swim(); + } else { + System.out.println("这只动物不会游泳"); + } + if (cat instanceof Swimmable) { + ((Swimmable) cat).swim(); + } else { + System.out.println("猫不会游泳"); + } + // 4. 直接创建Dog对象测试 + System.out.println("\n=== 直接调用Dog方法 ==="); + Dog myDog = new Dog(); + myDog.makeSound(); + myDog.swim(); + } + } \ No newline at end of file diff --git a/w6/Cat.java b/w6/Cat.java new file mode 100644 index 0000000..762fda5 --- /dev/null +++ b/w6/Cat.java @@ -0,0 +1,9 @@ +/** + * 猫类,仅继承动物抽象类,不实现游泳接口 + */ +public class Cat extends Animal { + @Override + public void makeSound() { + System.out.println("猫叫:喵喵喵!"); + } +} \ No newline at end of file diff --git a/w6/Dog.java b/w6/Dog.java new file mode 100644 index 0000000..d3d94fb --- /dev/null +++ b/w6/Dog.java @@ -0,0 +1,14 @@ +/** + * 狗类,继承动物抽象类,实现游泳接口 + */ +public class Dog extends Animal implements Swimmable { + @Override + public void makeSound() { + System.out.println("狗叫:汪汪汪!"); + } + + @Override + public void swim() { + System.out.println("狗在游泳:狗刨式前进!"); + } +} \ No newline at end of file diff --git a/w6/README.md b/w6/README.md new file mode 100644 index 0000000..9492be3 --- /dev/null +++ b/w6/README.md @@ -0,0 +1,27 @@ +#动物叫声系统 + +1.功能说明 + +基于Java抽象类和接口实现动物叫声系统,Dog和Cat继承Animal类实现叫声,Dog额外实现Swimmable接口实现游泳能力,在main方法中完成多态调用测试。 + + + +2.编译运行命令 +javac AnimalTest.java +java AnimalTest + + +3.项目结构 + +src/ + +├── Animal.java # 动物抽象类 + +├── Swimmable.java # 游泳接口 + +├── Dog.java # 狗类(继承Animal+实现Swimmable) + +├── Cat.java # 猫类(仅继承Animal) + +└── AnimalTest.java # 主测试类 + diff --git a/w6/Swimmable.java b/w6/Swimmable.java new file mode 100644 index 0000000..3d5856b --- /dev/null +++ b/w6/Swimmable.java @@ -0,0 +1,9 @@ +/** + * 游泳能力接口,定义会游泳的动物的行为 + */ +public interface Swimmable { + /** + * 游泳方法 + */ + void swim(); +} \ No newline at end of file diff --git a/w6/ai协助记录.txt b/w6/ai协助记录.txt new file mode 100644 index 0000000..8308195 --- /dev/null +++ b/w6/ai协助记录.txt @@ -0,0 +1,16 @@ +# AI协助记录 + 一、开发过程中遇到的问题 +1. 多态调用接口方法的问题 + 问题:使用`Animal`父类引用指向`Dog`对象时,无法直接调用`swim()`方法,编译报错。 + 解决:通过`instanceof`关键字判断对象是否实现了`Swimmable`接口,再进行强制类型转换后调用。 +2. 抽象类与接口的使用混淆 + 问题:不清楚何时用抽象类、何时用接口,导致初始设计逻辑混乱。 + 解决:明确抽象类用于**继承通用属性/行为**(动物的叫声是所有动物的通用行为),接口用于**扩展额外能力**(游泳是部分动物的能力),因此`Animal`用抽象类,`Swimmable`用接口。 +3. 方法重写的规范问题 + 问题:子类重写抽象方法时,忘记加`@Override`注解,代码可读性差。 + 解决:在所有重写方法上添加`@Override`注解,规范代码,同时让编译器检查重写是否正确。 + +二、优化调整 +1. 增加`instanceof`判断,避免类型转换异常 +2. 为所有类和方法添加JavaDoc注释,提升代码可读性 +3. 补充多场景测试(父类引用+直接对象调用),完整验证多态特性 \ No newline at end of file diff --git a/w6/运行输出.jpg b/w6/运行输出.jpg new file mode 100644 index 0000000..eb12405 Binary files /dev/null and b/w6/运行输出.jpg differ