← SEARCHABLE ARCHIVE
Java · 2026-07-26

从 Java 基础到掌握 — 第 4 集

将多态性与继承和接口结合使用

INTERACTIVE READING MODE →

该博客上撰写的文章是出于教学目的而创建的。 另外,文章中的信息可能不正确,请谨慎。

当多个对象需要以相同的方式使用时,可以使用接口和继承。 如果调用代码依赖于必要的角色而不是特定的类,则它更难以更改。

界面

public interface Damageable {
    boolean isAlive();
    void takeDamage(int amount);
}

public final class Monster implements Damageable {
    private int health = 100;

    @Override
    public boolean isAlive() {
        return health > 0;
    }

    @Override
    public void takeDamage(int amount) {
        health = Math.max(0, health - amount);
    }
}

攻击代码是Damageable,而不是Monster。 即使以后添加了可破坏的盒子,也可以用同一个合约来处理。

抽象类和继承

public abstract class Skill {
    private final String name;

    protected Skill(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public abstract void execute(Damageable target);
}

抽象类可以共享公共状态和实现,同时将一些行为留给其子类。 继承还结合了父级的规则,因此如果为了简单的代码重用而使其更深,则更改的范围会增加。

多态性

List<Damageable> targets = List.of(
    new Monster(),
    new TrainingDummy()
);

for (Damageable target : targets) {
    target.takeDamage(10);
}

即使进行相同的调用,也会执行适合实际对象的实现。 调用者不必使用 instanceof 列出所有具体类型。

接口表达角色,抽象类提供共同的基础。 如果可以组合小的、可组合的对象,它通常比继承更简单。