Files
gc-plan/week1/day06/AnimalHierarchy.java
2026-04-29 23:45:17 +08:00

146 lines
4.0 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package day06;
/**
* 第 6 天:面向对象(下)—— 继承、多态、接口、抽象类
* 目标:理解 OOP 三大特性中的"继承"和"多态"
*
* 重点:
* extends —— 单继承:子类拥有父类的属性和方法
* @Override —— 方法重写:子类用自己的实现覆盖父类方法
* 抽象类 —— 不能被 new可以有抽象方法留给子类实现
* 接口 —— 一组行为规范(方法签名),一个类可以实现多个接口
* 多态 —— 父类引用指向子类对象Animal a = new Dog();
*/
// ==================== 1. 抽象父类 ====================
abstract class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
public String getName() {
return name;
}
// 抽象方法:没有方法体,子类必须实现
public abstract String makeSound();
// 普通方法:有方法体,子类可以继承也可以重写
public void eat() {
System.out.println(name + " 正在吃东西。");
}
}
// ==================== 2. 接口 ====================
interface Pet {
void play(); // 接口中的方法默认是 public abstract
String getBreed(); // 品种
}
// ==================== 3. 子类 Dog ====================
class Dog extends Animal implements Pet {
private String breed; // 品种
public Dog(String name, String breed) {
super(name); // 调用父类构造方法(必须放在第一行)
this.breed = breed;
}
@Override
public String makeSound() {
return "汪汪汪!";
}
@Override
public void play() {
System.out.println(name + "" + breed + ")兴奋地摇着尾巴,接住了飞盘!");
}
@Override
public String getBreed() {
return breed;
}
@Override
public void eat() {
System.out.println(name + " 狼吞虎咽地吃着狗粮。");
}
}
// ==================== 4. 子类 Cat ====================
class Cat extends Animal implements Pet {
private String breed;
public Cat(String name, String breed) {
super(name);
this.breed = breed;
}
@Override
public String makeSound() {
return "喵喵喵~";
}
@Override
public void play() {
System.out.println(name + "" + breed + ")懒洋洋地拨弄着逗猫棒。");
}
@Override
public String getBreed() {
return breed;
}
@Override
public void eat() {
System.out.println(name + " 优雅地小口吃着猫粮。");
}
}
// ==================== 测试类 ====================
class AnimalTest {
public static void main(String[] args) {
System.out.println("========== 动物继承体系演示 ==========\n");
// 1. 基本使用
Dog wangcai = new Dog("旺财", "金毛");
Cat miaomiao = new Cat("咪咪", "英短");
System.out.println("--- 各自叫 ---");
System.out.println(wangcai.getName() + "" + wangcai.makeSound());
System.out.println(miaomiao.getName() + "" + miaomiao.makeSound());
System.out.println("\n--- 各自吃 ---");
wangcai.eat();
miaomiao.eat();
System.out.println("\n--- 各自玩 ---");
wangcai.play();
miaomiao.play();
// 2. ★ 多态:父类引用指向子类对象
System.out.println("\n--- 多态演示 ---");
Animal[] zoo = { // Animal 类型的数组
new Dog("阿黄", "中华田园犬"),
new Cat("小花", "橘猫"),
new Dog("小黑", "拉布拉多")
};
for (Animal a : zoo) {
// 运行时决定调用哪个子类的 makeSound动态绑定
System.out.println(a.getName() + "" + a.makeSound());
a.eat();
}
// 3. 接口引用
System.out.println("\n--- 接口多态 ---");
Pet[] pets = { wangcai, miaomiao };
for (Pet p : pets) {
System.out.print(p.getBreed() + " -> ");
p.play();
}
}
}